C++11,仅将一个字段复制到向量中
C++11, copying just one field into a vector
假设我在C++中有以下结构
struct Foo {
double a;
int b;
};
假设我有一个参数来声明如下的某个函数:
const std::initializer_list<Foo> &args;
有没有一种简洁的方法可以从args
中的元素中提取一个字段,例如,仅获得一个包含原始args
列表中每个b
字段的 std::vector?
当然,我知道我可以通过明确地将其写成循环来做到这一点:
std::vector<int> result;
for(auto &x:args) {
result.push_back(x.b);
}
。但鉴于我可以将任何类型的整个initializer_list复制到一行C++中的类似类型向量,只需使用 std::copy 和 std::back_inserter 等函数,我想知道是否有更优雅的方法也可以做到这一点,使用 stl 或可能已经存在的 C++11 设施。
您可以使用std::transform
并通过std::back_inserter
将元素添加到向量中:
std::transform(std::begin(args), std::end(args), std::back_inserter(result),
[] (const Foo & foo) { return foo.b; });
如果您发现 lambda 太冗长,则可以改用std::mem_fn
(功劳归于 @StoryTeller)。
std::transform(std::begin(args), std::end(args), std::back_inserter(result), std::mem_fn(&Foo::b));
但话又说回来,你的方法不一定是坏的,因为它非常可读并且做得很好(可能会有一些性能问题)。
一种解决方案可以是使用 linq++,如下所示:
shared_ptr<vector<Foo>> foo_list;
// suppose foo_list is being filled
shared_ptr<vector> bs = from(foo_list).select(&_1 ->* &Foo::b).get();
相关文章:
- 我正在尝试一个傻瓜 C++ 练习,我遇到了一个错误,说类 'GraduateStudent' 没有任何名为 'advisor' 的字段
- 如何创建一个函数来提取向量内部字符串中的字段?
- 如何正确实例化静态字段 tat 是另一个类对象
- 为什么最后一个推回向量的对象的字段会转移到向量的其他对象?
- C++11,仅将一个字段复制到向量中
- 从一个类访问私有字段到另一个与C++中的前一个类无关的私有字段 (OOP)
- 指向结构中的数组的指针,其中每个字段都是一个动态数组
- 访问另一个类(系统)的非静态字段,就好像它是我自己的字段一样 - 优雅地
- C++创建一个链表,每个节点有超过 2 个字段
- 在C++(arduino)中,我如何使用一个字段来构建另一个字段
- 模拟一个函数,该函数像操作员=和破坏者一样传播到每个字段
- 如何在 中输入记录的一个字段时搜索记录
- 两个 4 位位字段加起来不等于一个字节的大小 - 如何修复?
- 使用方法影响另一个对象的字段
- 调用方法,该方法修改字段,而使用该字段的另一个方法正在执行
- 从结构向量中,获取一个向量,该向量收集每个结构的一个字段
- 设计具有变体字段的文本类型类,其中可以存储一个或三个对象
- C 11 RVALUE的字段是一个rvalue
- 在一个结构中,使用一个数组字段访问另一个是否合法
- 通过另一个对象C++的字段中的指针访问对象