如何将作为元素结构的矢量的所有元素复制到集合中。
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
是一个对象的矢量。
答案 0 :(得分:9)
你的代码绝对没问题。在这种情况下,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
是私密的,那么您需要一个吸气者来给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
来移动字符串而不重新分配,并避免<functional>
对mem_fn
的依赖关系1}}使用lambda。
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); }
);
答案 1 :(得分:1)
您有访问每个节点,但您可以在std::transform
struct StringFromInfo { std::string operator()(const Info& info) { return info.code; } };
std::transform(infVect.begin(), infVect.end(), std::back_inserter(uniqueCodes), StringFromInfo());