c++ - 使用 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 解决方案。
解决方案
您应该使用std::transform
一元操作函数对象来对每个元素执行转换。例如
std::transform(std::begin(people),
std::end(people),
std::back_inserter(last_names),
[](const Person& person) { return person.last_name; }
);
推荐阅读
- javascript - 在 Angular 中捕获 SVG 内的类的点击事件
- angular - GCP App Engine / Angular - 无法加载模块脚本:服务器以“text/html”的非 JavaScript MIME 类型响应
- c++ - VS Code C/C++ Intellisense 更新后停止工作
- firebase - 如何使用 Flutter 更新 Firebase 中没有所有数据的部分数据
- python - 当内部数组的大小不同时,将数组的 np 数组转换为火炬张量
- html - 显示带有 contentEditable 折叠的表格
- angular - 编译时无法解析应用程序的模块/无法解析模块@angular/core
- python - 为什么我的机器人只是在反应 discord.py 时关闭
- kotlin - 带有 Kotlin DSL 的 Gradle 期望属性
错误 - mongodb - 获取嵌套关系数据 $lookup