7

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

由于我想做很多std::find_if基于std::string元素的事情,我相信一个std::map<string,double,MyOwnBinaryPredicate>with lower_boundandupper_bound会更合适。

事实是我想以一种有效的方式加入insert元素。std::map所以我想使用一个额外的迭代器来insert加快速度。

我相信最简单的方法是使用 a来const_reverse_iterator遍历std::list和使用begin().std::map

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

谢谢!

4

3 回答 3

11

如果您已经有一个排序列表,它是根据 predicate 排序的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());
于 2010-08-05T07:51:50.513 回答
4

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

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

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

于 2010-08-05T07:49:53.217 回答
0

我会在列表上进行迭代并将每一对插入到地图中,或者使用 Luther Blissett 描述的简洁方法。
我不明白你在做什么,这意味着它要么导致代码不可读,要么你离题了。
你为什么这样做?
您可以更改代码以首先返回地图而不是列表吗?

于 2010-08-05T07:50:50.877 回答