如何std::map<std::string, Foo>
从 a 构造 a std::vector<std::pair<std::string, Foo> >
?似乎 std::map 可以从输入迭代器构造。
更新
顺便说一句,在将向量中的字符串添加到地图时,我需要将它们转换为小写形式。这是因为我希望使用地图来获得向量中内容的排序版本。
每个标准库容器都可以从一个迭代器范围构造。在你的情况下:
std::map<std::string, Foo> mymap(myvector.begin(), myvector.end());
如果要添加字符串的小写版本,则需要通过转换迭代器传递值。不幸的是,标准 C++ 中没有包含它,但实现起来相当简单。Boost 还包括一个版本:
// Make the pair's key lower-case
std::pair<std::string, Foo> make_lower(std::pair<std::string, Foo> x) {
std::transform(x.first.begin(), x.first.end(), x.first.begin(), ::tolower);
return x;
}
std::map<std::string, int> mymap(
boost::make_transform_iterator(myvector.begin(), make_lower),
boost::make_transform_iterator(myvector.end(), make_lower));
根据 map 构造函数定义,函数模板参数InputIterator应该是一个输入迭代器类型,它指向可以构造value_type对象的类型的元素(在 map 中, value_type是 pair< const key_type, mapped_type > 的别名)
std::vector<std::pair<std::string, Foo> > V;
//Fill the Vector V using make_pair...or other method
//Vector iterator can be used to construct the Map since you get the pair
std::map<std::string, Foo> M(V.begin(),V.end());
std::map<std::string, Foo> m;
std::vector<std::pair<std::string, Foo> > vec;
std::vector<std::pair<std::string, Foo> >::iterator it = vec.begin();
for(;it!=vec.end();++it)
{
std::string temp = it->first;
std::for_each(temp.begin(), temp.end(),
[](char& c){ tolower((unsigned char)c);});
m[temp] = it->second;
}