如何将对象的属性复制到向量?

时间:2013-12-12 12:48:52

标签: c++ stl iterator stdvector

我有一个vector<Person>,想要将每个对象的属性名称提取到vector<string>。 for-each循环可以正常工作,但有一种更好的方法可以使用像std::copy()这样的东西并告诉他使用特定的方法(在这种情况下是name() getter)将值复制到我的vector<string>

class Person {
  int a;
  string n;
public:
  Person(int age, string name) : a(age), n(name) {}
  int age() const { return a; }
  string name() const { return n; }
};

vector<Person> ppl = { Person(12, "Tim"), Person(21, "Tom") };
vector<string> names;

// question
// copy(ppl.begin(), ppl.end(), ????.name());

for (Person& p : ppl)
  names.push_back(p.name());

copy(names.begin(), names.end(), ostream_iterator<string>(cout, ", "));

3 个答案:

答案 0 :(得分:6)

std::transformstd::back_inserter的对比如何:

std::transform(std::begin(ppl), std::end(ppl),
               std::back_inserter(names),
               [](const Person& p) -> std::string { return p.name(); });

最后,它仍然与你已经拥有的基本相同。

答案 1 :(得分:4)

基于范围的for循环通常是对容器的每个元素执行任意操作的最直接方式。还有transform算法:

transform(
    ppl.begin(), 
    ppl.end(), 
    back_inserter(names),
    [](Person const & p){return p.name();}
);

答案 2 :(得分:1)

vector<string> names(ppl.size());
transform(ppl.begin(), ppl.end(), names.begin(), [](const Person& p) { return p.name(); });

或C ++ 03:

transform(ppl.begin(), ppl.end(), names.begin(), mem_fun(&Person::name));