如何将std :: pair的已排序std :: list转换为std :: map

时间:2010-08-05 07:33:18

标签: c++ insert stdmap stdlist std-pair

我有一个std::list< std::pair<std::string,double> >,我知道它是根据std::string element排序的。

由于我希望根据std::find_if元素执行大量std::string,因此我认为std::map<string,double,MyOwnBinaryPredicate> lower_boundupper_bound会更多足够的。

事实是,我希望insert中的std::map元素能够有效地发挥作用。所以我想使用额外的迭代器来加快insert

我认为最简单的方法是使用const_reverse_iterator浏览std::list并使用begin()的{​​{1}}。

你会这样做,还是一个坏主意?

谢谢!

3 个答案:

答案 0 :(得分:11)

如果您已经有一个排序列表,它根据谓词Predicate排序,您可以执行以下操作:

std::list< std::pair<std::string, double> > sorted_list;
std::map<string, double, Predicate> map(sorted_list.begin(), sorted_list.end());

如果您的列表已经排序,则map构造函数具有线性时间复杂度,否则为O(n * log n)。然后,您可以像处理任何其他地图一样直接使用地图。

如果您以后希望将结果返回到列表中,则可以执行相反的操作:

sorted_list.assign(map.begin(), map.end());

答案 1 :(得分:4)

您可以使用std :: copy和std :: inserter:

std::copy(the_list.begin(),the_list.end(),std::inserter(the_map,the_map.begin()));  

因为列表的迭代器&lt;对&gt;具有与map&lt;兼容的值类型X,Y&gt;的迭代器。

答案 2 :(得分:0)

我只是迭代列表并将每一对插入地图或使用Luther Blissett描述的简洁方法。
事实上,我没有得到你想要做的事情意味着它会导致代码不可读或你离开。
你为什么这样做呢? 您是否可以更改代码以将地图返回给您而不是首先返回列表?