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

时间:2012-01-13 17:40:07

标签: c++ inheritance stl

我有以下设置

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>);
等等,但这有点笨拙。有什么好的选择吗?

提前致谢!

3 个答案:

答案 0 :(得分:2)

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

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

例如,如果您有int get_a_member(obj&)功能,只需致电

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

如果您想要更复杂或可重复使用的功能,请将其改为仿函数。然后你可以在它的构造函数中将参数传递给它(例如告诉它返回哪个成员)。

答案 1 :(得分:1)

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

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"));
}

答案 2 :(得分:0)

我理解的是,您希望某个函数从给定a中的obj中提取vector的值,并将其放入另一个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;
}