从 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> >

本文关键字:gt lt std map 一个 air vector      更新时间:2023-10-16

如何从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());