从std :: vector <std :: pair <t,u>&gt; </std :: pair <t,u> </t,u>构造std :: map <t,u>

时间:2013-09-03 09:37:59

标签: c++ c++98

如何从std::map<std::string, Foo>构建std::vector<std::pair<std::string, Foo> >?似乎std :: map可以从输入迭代器构造。

更新

顺便提一下,我需要将向量中的字符串转换为小写形式,然后将它们添加到地图中。这是因为我希望使用地图来获取向量中的排序版本。

3 个答案:

答案 0 :(得分:6)

每个标准库容器都可以从迭代器范围构造。在你的情况下:

std::map<std::string, Foo> mymap(myvector.begin(), myvector.end());

如果要添加字符串的小写版本,则需要通过转换迭代器传递值。不幸的是,它没有包含在标准C ++中,但它实现起来相当简单。 Boost also includes a version

// 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));

Here’s a complete, running demonstration

答案 1 :(得分:0)

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;

 }

答案 2 :(得分:0)

根据映射构造函数定义,函数模板参数 InputIterator 应为输入迭代器类型,指向可以构造 value_type 对象的类型的元素(在地图中, value_type 是对&lt; const key_type,mapped_type&gt;)的别名

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());