我有一个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, ", "));
答案 0 :(得分:6)
std::transform
与std::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));