从std::vector存储到std::set,其中vector包含一个结构体,而std::set只包含该结构体中的一个

Storing from std::vector to std::set where vector contains a structure but std::set contains only one element from the struct

本文关键字:std set 结构体 vector 一个 包含该 其中 存储 包含一      更新时间:2023-10-16

如何将vector(元素结构体)中的所有元素复制到集合中?

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

你的代码绝对没问题。在这种情况下,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是私有的,你需要一个getter给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来移动字符串而不需要重新分配,并且通过使用lambda来避免mem_fn<functional>的依赖。

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

您可以访问每个节点,但是您可以在std::transform

中隐藏迭代。
struct StringFromInfo { std::string operator()(const Info& info) { return info.code; } };
std::transform(infVect.begin(), infVect.end(), std::back_inserter(uniqueCodes), StringFromInfo());