我有以下设置
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>);
等等,但这有点笨拙。有什么好的选择吗?
提前致谢!
答案 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;
}