首页 > 解决方案 > 使用 back_inserter 从结构的单个成员创建向量

问题描述

我想知道是否可以使用std::back_inserter从更复杂的结构中创建仅包含单个元素的向量。例如,在以下代码中:

struct Person {
  std::string first_name;
  std::string last_name;
  int id;
};
std::vector<Person> people;
// Populate 'people'...

// Extract last names into single vector
std::vector<std::string> last_names;
std::copy(begin(people), end(people), std::back_inserter(last_names)); // <... ?

到目前为止,我发现的唯一解决方案是创建一个强制转换运算符Person -> std::string

struct Person {
  // ...
  operator std::string() const { return last_name; }
};

但是,如果我想将first_name和提取last_name到两个向量中,这不是一个好的解决方案,更不用说如何变得晦涩难懂了。

有什么方法可以指示std::back_inserter如何构造要插入的元素?还有其他方法可以创建这样的向量吗?显然,我指的不是原始方式:

std::vector<std::string> last_names;
last_names.reserve(people.size());
for (const auto& person : people) {
  last_names.push_back(person.last_name);
}

但对于一些<algorithm>类似的人;)

我更喜欢仅 C++ 的答案,但如果需要,我愿意接受 Boost 解决方案。

标签: c++copystl-algorithm

解决方案


您应该使用std::transform一元操作函数对象来对每个元素执行转换。例如

std::transform(std::begin(people), 
               std::end(people), 
               std::back_inserter(last_names), 
               [](const Person& person) { return person.last_name; }
              );

推荐阅读