使用 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_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 解决方案。
您应该改用 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));
我想知道是否可以使用 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 解决方案。
您应该改用 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));