从对象向量中提取元素

Kon*_*ong 5 c++ vector

给定一个对象向量,是否有一种优雅的方法来提取其成员?我目前只是使用 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)

Jar*_*d42 5

使用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)

演示


Ap3*_*p31 3

由于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并且没有吸气剂,但提取它会非常困难。