从std::vector存储到std::set,其中vector包含一个结构体,而std::set只包含该结构体中的一个
Storing from std::vector to std::set where vector contains a structure but std::set contains only one element from the struct
如何将vector(元素结构体)中的所有元素复制到集合中?
struct info
{
std::string code;
std::string curDate;
int iVar;
};
std::vector<info> infVect; // Load data into the vector from the database
std::set<std::string> uniqueCodes;
for ( int i = 0; i < infVect.size() ; ++i)
uniqueCodes.insert(infVect[i].code);
是否有一种更快的方法来存储从vector到set的元素,而不需要在循环中迭代每个元素?
注意:
std::set<std::string> uniqueCodes(infVect.begin(), infVect.end() )
,如果infVect
只有代码,则可以工作。但是infVect
是一个对象向量
你的代码绝对没问题。在这种情况下,for
循环是表达您的意思的最简单的方法。基于c++ 11范围的for
甚至更简单:
for (const auto& i : infVect)
uniqueCodes.insert(i.code);
如果您想要一个替代方案,这里是如何通过仅粘合STL特性来实现的。
通过std::transform
运行,提取成员并将其插入set
。mem_fn
帮助器将成员函数或成员变量转换为函子。
std::transform(
infVect.begin(),
infVect.end(),
std::inserter(uniqueCodes, uniqueCodes.end()),
std::mem_fn(&info::code)
);
如果code
是私有的,你需要一个getter给mem_fn
。
const std::string& getCode() const { return code; }
您需要以下标题:
#include <algorithm> // transform
#include <functional> // mem_fn
#include <iterator> // inserter
如果你不关心保留原来的vector
,你可以在c++ 11中使用std::move_iterator
来移动字符串而不需要重新分配,并且通过使用lambda来避免mem_fn
对<functional>
的依赖。
using namespace std; // for brevity
transform(
make_move_iterator(begin(infVect)),
make_move_iterator(end(infVect)),
inserter(uniqueCodes, end(uniqueCodes)),
[](info&& x) { return move(x.code); }
);
您可以访问每个节点,但是您可以在std::transform
struct StringFromInfo { std::string operator()(const Info& info) { return info.code; } };
std::transform(infVect.begin(), infVect.end(), std::back_inserter(uniqueCodes), StringFromInfo());
相关文章:
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 修改"std::set"中用户定义类型的值
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- std::set 是否将对象连续存储在内存中?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 有什么理由不扩展 std::set 以添加下标运算符吗?
- 我从 std::set 得到const_iterator而不是迭代器
- 为什么 std:set(带有单个冒号)可以编译?
- 遍历 std::set 中包含的所有三重不同值?
- 插入 std::set 作为 std::map 的键
- 如何在 c++ 中使用默认值将 std::set 转换为 std::map
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- 如何从 std::set 绘制 n 个元素的样本
- 为什么 std::set 容器使用的内存比其数据大小多得多?