给定一个对象向量,是否有一种优雅的方法来提取其成员?我目前只是使用 for 循环,但如果有办法做到这一点会很好。例子:
#include <vector>
struct Object {
int x;
float y;
};
int main() {
std::vector<Object> obj;
// Fill up obj
std::vector<int> all_x = obj.x; // Won't work obviously
}
Run Code Online (Sandbox Code Playgroud)
使用range-v3,它只是
std::vector<int> xs = objs | ranges::view::transform(&Object::x);
Run Code Online (Sandbox Code Playgroud)
或者只是使用视图:
auto xs = objs | ranges::view::transform(&Object::x);
Run Code Online (Sandbox Code Playgroud)
由于std::vector(或一般的 c++)不支持协变聚合,因此没有语法上漂亮的方法来执行您想要的操作。
如果您确实想使用元素成员进行初始化 ,那么您可以定义一个新的迭代器类,如下所示:all_xxobj
class getx_iter : public vector<Object>::iterator
{
public:
getx_iter(const vector<Object>::iterator &iter) : vector<Object>::iterator(iter) {}
int operator*() { return (*this)->x; }
};
Run Code Online (Sandbox Code Playgroud)
如果您可以初始化一个空vector的然后填充它,std::transform那么使用 labmda 是一个更清晰的选择(正如 @andar 所建议的那样)。
vector::reserve()您还可以使用and来避免额外的初始化back_inserter:
xs.reserve(foos.size());
std::transform(foos.begin(), foos.end(), back_inserter(xs), [](Foo f){return f.x;});
Run Code Online (Sandbox Code Playgroud)
另请注意,虽然x是 的私有成员Object并且没有吸气剂,但提取它会非常困难。
| 归档时间: |
|
| 查看次数: |
3240 次 |
| 最近记录: |