使用 back_inserter 从结构的单个成员创建向量

Using back_inserter to create vector from single member of struct

我想知道是否可以使用 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_namelast_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 解决方案。

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

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

只需添加备选方案,您还可以使用 std/boost::bind

  // Extract first names into single vector
  std::vector<std::string> last_names;

  last_names.reserve(people.size());
  std::transform(people.begin(), people.end(), std::back_inserter(last_names), 
                 std::bind(&Person::last_name, std::placeholders::_1));

See Here