想象一下,我有一个“人”对象数组:
#include <iostream>
class person{
public:
int age;
std::string name;
};
是否可以获得与每个人的年龄(或姓名)相同大小的数组?我知道怎么用循环来做,但我希望有一种“地图”可以让我在同一行中相同。
答案 0 :(得分:1)
是的,您可以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;
这会动态提取原始容器中所有人的年龄。
答案 1 :(得分:1)
为了一般性,我假设数组是指动态大小的数组,那么完整的例子就是:
#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;});
}
在任何情况下,都没有神奇的方法可以从一组实例中获取成员数组。某处必须有一个循环(转换只是非常好地隐藏了你的循环)。
答案 2 :(得分:1)
以下是std::transform
,std::back_inserter
和lambda的完成方式:
#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
更新以避免不必要的重新分配,您可以在致电ages.reserve(pp.size())
之前致电std::transform