2017-10-10 85 views
2

想象一下,我有“人”对象的数组:如何从C++中的对象数组中获取数据成员的数组?

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

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

+1

['std :: transform'](http://en.cppreference.com/w/cpp/algorithm/transform)可以使用。不知道这是不是太压倒。 – nwp

+1

无论你是否需要编写它,都会有一个循环。 – AndyG

+2

用[range-v3](https://github.com/ericniebler/range-v3):'persons |范围::观点::变换(人::年龄)'。 – Jarod42

回答

1

下面是如何将其与std::transformstd::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 

Live demo

UPDATE:,以避免不必要的重复 - 您可以拨打ages.reserve(pp.size())在拨打std::transform

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

对于一般性的缘故我与阵列假设你指的是动态大小的数组,则完整的例子将是:

#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

相关问题