如何使用 STL 将结构向量转换为映射
How to transform a vector of struct into a map using STL
我有一个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
的最佳方法是什么?
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());
更简洁...
基本上,使用算法很好,但不要仅仅为了使用它们而使用它们..
您只需要同时绑定 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)));
我有一个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
的最佳方法是什么?
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());
更简洁...
基本上,使用算法很好,但不要仅仅为了使用它们而使用它们..
您只需要同时绑定 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)));