我有std::vector<Person> v
struct Person
{
Person(int i,std::string n) {Age=i; this->name=n;};
int GetAge() { return this->Age; };
std::string GetName() { return this->name; };
private:
int Age;
std::string name;
};
我需要转换为std::map<std::string,int> persons
在编写类似this的内容时遇到了问题:
std::transform(v.begin(),v.end(),
std::inserter(persons,persons.end()),
std::make_pair<std::string,int>(boost::bind(&Person::GetName,_1)), (boost::bind(&Person::GetAge,_1)));
在c ++ 03中使用stl算法将vector<Person> v
转换为map<std::string,int> persons
的最佳方法是什么?
答案 0 :(得分:6)
IMO,一个简单的for循环在这里更加清晰..
for (vector<Person>::iterator i = v.begin(); i != v.end(); ++i)
persons.insert(make_pair(i->GetName(), i->GetAge()));
你不可能认为你需要的bind
混乱比上面更清楚..
在C ++ 11中,这变成了
for (auto const& p : v)
persons.emplace(p.GetName(), p.GetAge());
更简洁......
基本上,使用算法很好,但不要仅仅为了使用它们而使用它们。
答案 1 :(得分:3)
您只需绑定std::make_pair
:
std::transform(v.begin(), v.end(),
std::inserter(persons, persons.end()),
boost::bind(std::make_pair<std::string, int>,
boost::bind(&Person::GetName, _1),
boost::bind(&Person::GetAge, _1)));