从对象的向量中获取成员的向量

Getting vectors of members from vectors of objects

本文关键字:向量 成员 获取 对象      更新时间:2023-10-16

我有以下设置

class obj {
  public:
  int a();
  int b();
  int c();
  int d();
};
std::vector<obj> obj_vector;
//Fill obj_vector

我想访问这些方法(这是用于一个单独期望int向量的接口)。

void func(vector<int>a ,vector<int> b,vector<int> c,vector<int> d);

我最初认为扩展矢量是最好的方法,但已经被警告不要这样做

我已经实现了

get_a_vec(vector<obj>);

等等,但这有点笨拙。有什么好的选择吗?

提前感谢!

编写一个函数,从单个对象中检索所需的成员。

然后将该函数传递给std::transform

例如,如果您有int get_a_member(obj&)函数,只需调用

std::vector<int> avec;
std::transform(obj_vector.begin(), obj_vector.end(), get_a_member);

如果您想要一个更复杂或可重用的函数,请将其作为函子。然后您可以在它的构造函数中向它传递参数(例如告诉它返回哪个成员)。

您可以编写一个通用函数来从一系列对象中提取任何类成员:

template <typename InIt, typename OutIt, typename Class, typename Member>
void extract(InIt start, InIt end, OutIt out, Member Class::*member) {
    for (; start != end; ++start, ++out) {
        *out = (*start).*member;
    }
}
// Example
int main()
{
    std::vector<obj> objs {{1,2,3,4},{5,6,7,8}};
    std::vector<int> ints;
    extract(objs.begin(), objs.end(), back_inserter(ints), &obj::a);
    std::copy(ints.begin(), ints.end(), 
              std::ostream_iterator<int>(std::cout, "n"));
}

我所理解的是,您想要一个函数,从给定vector中的obj中提取a的值,并将其放入另一个vector中,如果这是真的,那么我建议使用friend函数。

在类obj中声明友元函数允许该函数访问该类的private数据成员。

class obj {
    friend vector<int> get_a_vec(const vector<obj>&);
    friend vector<int> get_b_vec(const vector<obj>&);
    friend vector<int> get_c_vec(const vector<obj>&);
    friend vector<int> get_d_vec(const vector<obj>&);     
    int a;
    int b;
    int c;
    int d;
};
vector<int> get_a_vec(const vector<obj>& vec)
{
    vector<int> result(vec.size());
    for (unsigned i = 0;i<vec.size();i++)
        result->at(i) = vec[i].a;
    return result;
}