发布
社区首页 >问答首页 >如何将已排序的std::对的std::list转换为std::map

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

Stack Overflow用户
提问于 2010-08-05 15:33:18
回答 3查看 1.8K关注 0票数 7

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

因为我想做很多基于std::string元素的std::find_if,所以我相信带有lower_boundupper_boundstd::map<string,double,MyOwnBinaryPredicate>会更合适。

事实上,我想以一种有效的方式在std::map中使用insert元素。所以我想使用一个额外的迭代器来使insert更快。

我认为最简单的方法是使用const_reverse_iterator遍历std::list并使用std::mapbegin()

你会这样做吗,或者这是个坏主意?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-05 15:51:51

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

代码语言:javascript
代码运行次数:0
复制
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 )。然后,您可以像使用任何其他地图一样直接使用该地图。

如果你以后想要结果回到你的列表中,你可以做相反的事情:

代码语言:javascript
代码运行次数:0
复制
sorted_list.assign(map.begin(), map.end());
票数 11
EN

Stack Overflow用户

发布于 2010-08-05 15:49:53

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

代码语言:javascript
代码运行次数:0
复制
std::copy(the_list.begin(),the_list.end(),std::inserter(the_map,the_map.begin()));  

因为list< pair >的迭代器具有与map< X,Y>的迭代器兼容的值类型。

票数 4
EN

Stack Overflow用户

发布于 2010-08-05 15:50:51

我只需迭代列表并将每一对都插入到映射中,或者使用Luther Blissett描述的整洁方法。

我不明白你想要做什么,这意味着它要么导致代码无法阅读,要么你走错了路。

你为什么要这样做呢?

您能否更改代码,首先向您返回一个地图,而不是一个列表?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3412623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档