我有一个std :: list<的std ::对<的std :: string,双> >,我知道它是根据std :: string元素排序的.
因为我想基于std :: string元素做很多std :: find_if,我相信std :: map< string,double,MyOwnBinaryPredicate>使用lower_bound和upper_bound会更充足.
事实是我想以有效的方式在std :: map中插入元素.所以我想使用额外的迭代器来使插入更快.
我相信最简单的方法是使用const_reverse_iterator来浏览std :: list并使用std :: map的begin().
你会这样做,还是一个坏主意?
谢谢!
解决方法
如果您已经有一个排序列表,它根据谓词Predicate排序,您可以执行以下操作:
std::list< std::pair<std::string,double> > sorted_list; std::map<string,Predicate> map(sorted_list.begin(),sorted_list.end());
如果列表已经排序,则映射构造函数具有线性时间复杂度,否则为O(n * log n).然后,您可以像处理任何其他地图一样直接使用地图.
如果您以后希望将结果返回到列表中,则可以执行相反的操作:
sorted_list.assign(map.begin(),map.end());