2009-06-11 39 views
8

它似乎来自我的简单测试,但我想知道这是否有保证?当从begin()到end()迭代时,STL贴图是否总是给出相同的顺序?

是否有条件下订单将不能得到保证?

编辑:我特别感兴趣的情况是,如果我填充了大量条目的地图,将itertator的顺序是在我的可执行文件的多次运行相同?如果条目以不同的顺序插入会怎样?

+0

如果你需要的元素的保证订货,你不应该使用像结构列表?根据定义,映射没有顺序,因为值被放置在通过散列键来确定位置。 – Gishu 2009-06-11 03:35:42

+1

请注意排序和顺序之间的差异。 List,vector和dequeue是序列容器。设置和映射是有序的容器。 – Flame 2011-08-18 05:02:18

回答

9

是的,它维护着一个内部顺序,所以对一个不变的集合的迭代应该总是相同的。从here

内部,在地图 的要素从低下面就 建设设置一个特定的严格弱 排序标准进行排序,以较高的关键 值。

0

如果STL贴图没有改变,STL贴图是否与开始/结束的顺序相同?是。如果您更改地图,请不要依赖于保持不变的顺序。

+0

...但未改变的元素的排序保持不变 - 任何插入或删除都会按照定义的排序关系反映在序列中的适当位置。也就是说,对地图的更改将以完全可预测的方式更改迭代顺序。 – 2009-06-12 02:19:05

-2

在与STL相同的实现下的相同数据集上,是的。就我所知,不能保证在不同的实现中是相同的。

+1

只要比较器提供有效的严格弱排序,它就保证在所有实现中都是相同的,否则所有投注都关闭! – 2009-06-11 04:55:53

+0

所以它保证,除非它不是? :) – 2009-06-17 12:57:11

6

std::map排序容器,所以,是的,为了保证(一样的,你在其构造或明或暗地使用排序)。做不是虽然在流行的(虽然尚未标准)hashmap虽然 - 它在很多情况下有很多优点,但不是迭代的可预测的顺序!

1

的std ::地图是已排序的集合
,你必须定义在低于运营商
想象m是地图类型T的:

assert(m.size() > 1); 
for (std::map<T>::const_iterator i = m.begin(); i != m.end(); ++i) { 
    std::map<T>::const_iterator j = i + 1; 
    while (j != m.end()) { 
     assert(*i < *j); 
     ++j; 
    } 
} 
相关问题