如何从C++中的对象数组中获取数据成员的数组?
问题描述:
想象一下,我有“人”对象的数组:如何从C++中的对象数组中获取数据成员的数组?
#include <iostream>
class person{
public:
int age;
std::string name;
};
是否有可能获得与每个人的年龄(或名称)相同大小的数组?我知道如何做一个循环,但我希望有一种“地图”,可以让我在同一行中。
答
下面是如何将其与std::transform
,std::back_inserter
来完成,并且拉姆达:
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
struct person{
int age;
std::string name;
};
int main()
{
std::vector<person> pp = {{16, "Bob"},{32, "Alice"}};
std::vector<int> ages;
std::transform(
pp.begin(),
pp.end(),
std::back_inserter(ages),
[](const person& p) -> int { return p.age; });
for(auto v: ages)
std::cout << v << " ";
}
输出:
16 32
UPDATE:,以避免不必要的重复 - 您可以拨打ages.reserve(pp.size())
在拨打std::transform
答
是的,你可以使用transform
既旧阵列和标准容器如std::vector
。
使用传统阵列
person persons[2] = { { 20, "name1" }, { 21, "name2" } };
for (auto & person : persons)
cout << person.age << " " << person.name << endl;
decltype(person::age) ages[sizeof(persons)/sizeof(persons[0])];
std::transform(std::begin(persons), std::end(persons), std::begin(ages), [](person & p) -> decltype(person::age) { return p.age; });
for (auto & age : ages)
cout << age << endl;
使用std::vector
std::vector<person> persons = { { 20, "name1" }, { 21, "name2" } };
for (auto & person : persons)
cout << person.age << " " << person.name << endl;
std::vector<decltype(person::age)> ages(persons.size());
std::transform(persons.begin(), persons.end(), ages.begin(), [](person & p) -> decltype(person::age) { return p.age; });
for (auto & age : ages)
cout << age << endl;
这种动态提取在原来的容器中的所有的人的年龄。
答
对于一般性的缘故我与阵列假设你指的是动态大小的数组,则完整的例子将是:
#include <string>
struct person {
int age;
std::string name;
};
std::vector<int> getAge(std::vector<person> p) {
std::vector<int> result;
result.reserve(p.size());
for (auto& e : p) result.push_back(e.age);
return result;
}
,或者您使用std::transform
这将是
#include <algorithm>
int main() {
std::vector<person> foo(10);
std::vector<int> ages(10);
std::transform(foo.begin(),foo.end(),ages.begin(),[](person& p){return p.age;});
}
在任何情况下,没有什么神奇的方式从一组实例中获取成员数组。在某个地方必须有一个循环(变换只是在你隐藏循环方面做得很好)。
+0
@不错,是固定的。直到现在,我才发现OP正在要求提供单线。但是,无论是编写函数还是使用算法,都可以在一行中完成,并且可以直接显示或不显示循环 – user463035818
['std :: transform'](http://en.cppreference.com/w/cpp/algorithm/transform)可以使用。不知道这是不是太压倒。 – nwp
无论你是否需要编写它,都会有一个循环。 – AndyG
用[range-v3](https://github.com/ericniebler/range-v3):'persons |范围::观点::变换(人::年龄)'。 – Jarod42