如何将作为元素结构的向量的所有元素复制到集合中.
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);
Run Code Online (Sandbox Code Playgroud)
是否有更快的方法将元素从向量存储到集合而不迭代循环中的每个元素?
注意:
std::set<std::string> uniqueCodes(infVect.begin(), infVect.end() )
,如果infVect
只有代码,将工作.但是infVect
是一个对象的向量.
你的代码绝对没问题.一for
环是表达你在这种情况下的意思最简单的方法.基于C++ 11范围的for
更简单:
for (const auto& i : infVect)
uniqueCodes.insert(i.code);
Run Code Online (Sandbox Code Playgroud)
如果你想要一个替代品,只需将STL功能粘在一起就可以实现.
运行它std::transform
以提取成员并将其插入到set
.所述mem_fn
辅助打开一个成员函数或成员变量成仿函数.
std::transform(
infVect.begin(),
infVect.end(),
std::inserter(uniqueCodes, uniqueCodes.end()),
std::mem_fn(&info::code)
);
Run Code Online (Sandbox Code Playgroud)
如果code
是私人的,你需要一个吸气剂给予mem_fn
.
const std::string& getCode() const { return code; }
Run Code Online (Sandbox Code Playgroud)
您需要以下标题.
#include <algorithm> // transform
#include <functional> // mem_fn
#include <iterator> // inserter
Run Code Online (Sandbox Code Playgroud)
如果您不关心保留原始文件vector
,可以std::move_iterator
在C++ 11中使用它来移动字符串而不重新分配,并通过使用lambda来避免<functional>
依赖mem_fn
.
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); }
);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3694 次 |
最近记录: |