从 std::vector<:p air<T,U,U> 构造一个 std::map<T,U> >
Construct a std::map<T,U> from a std::vector<std::pair<T,U> >
如何从std::vector<std::pair<std::string, Foo> >
构造std::map<std::string, Foo>
?std::映射似乎可以从输入迭代器中构造出来。
更新
顺便说一句,在将向量中的字符串添加到映射时,我需要将它们转换为小写形式。这是因为我希望使用映射来获得向量中whats的排序版本。
每个标准库容器都可以从迭代器范围构建。在您的情况下:
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));
这是一个完整的运行演示
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;
}
根据映射构造函数的定义,函数模板参数InputIterator应是一个输入迭代器类型,该类型指向可以构造value_type对象的类型的元素(在映射中,value _type是对<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());
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中