我有一个std::list< std::pair<std::string,double> >
,我知道它是根据std::string element
排序的。
由于我希望根据std::find_if
元素执行大量std::string
,因此我认为std::map<string,double,MyOwnBinaryPredicate>
lower_bound
和upper_bound
会更多足够的。
事实是,我希望insert
中的std::map
元素能够有效地发挥作用。所以我想使用额外的迭代器来加快insert
。
我认为最简单的方法是使用const_reverse_iterator
浏览std::list
并使用begin()
的{{1}}。
你会这样做,还是一个坏主意?
谢谢!
答案 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描述的简洁方法。
事实上,我没有得到你想要做的事情意味着它会导致代码不可读或你离开。
你为什么这样做呢?
您是否可以更改代码以将地图返回给您而不是首先返回列表?