2

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

    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);

有没有一种更快的方法来存储从向量到集合的元素,而无需迭代循环中的每个元素?

笔记:

std::set<std::string> uniqueCodes(infVect.begin(), infVect.end() ), 如果infVect只有代码就可以工作。但是infVect是对象的向量。

4

2 回答 2

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是私有的,你需要一个 getter 给mem_fn.

const std::string& getCode() const { return code; }

您需要以下标题。

#include <algorithm>  // transform
#include <functional> // mem_fn
#include <iterator>   // inserter

如果您不关心保留原始vector,您可以std::move_iterator在 C++11 中使用来移动字符串而无需重新分配,并通过使用 lambda 来避免对<functional>for 的依赖。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); }
);
于 2013-06-12T18:46:37.537 回答
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());
于 2013-06-12T18:43:22.530 回答