从std :: vector存储到std :: set其中vector包含一个结构,但std :: set只包含struct中的一个元素

nsi*_*akr 2 c++ vector set

如何将作为元素结构的向量的所有元素复制到集合中.

    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是一个对象的向量.

Jon*_*rdy 9

你的代码绝对没问题.一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)