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

时间:2013-06-12 18:36:47

标签: 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);

是否有更快的方法将元素从vector存储到set而不迭代循环中的每个元素?

注意:

std::set<std::string> uniqueCodes(infVect.begin(), infVect.end() ),如果infVect只有代码,则会有效。但是infVect是一个对象的矢量。

2 个答案:

答案 0 :(得分:9)

你的代码绝对没问题。在这种情况下,for循环是表达您的意思的最简单方法。基于C ++ 11范围的for甚至更简单:

for (const auto& i : infVect)
  uniqueCodes.insert(i.code);

如果你想要一个替代方案,只需将STL功能粘合在一起就可以做到这一点。

通过std::transform运行它以提取成员并将其插入setmem_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());