如何从c ++中的对象数组中获取数据成员数组?

时间:2017-10-10 13:50:09

标签: c++ arrays class mapping

想象一下,我有一个“人”对象数组:

#include <iostream>
class person{
public:
   int age;
   std::string name;
};

是否可以获得与每个人的年龄(或姓名)相同大小的数组?我知道怎么用循环来做,但我希望有一种“地图”可以让我在同一行中相同。

3 个答案:

答案 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::transformstd::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 

Live demo

更新以避免不必要的重新分配,您可以在致电ages.reserve(pp.size())之前致电std::transform