【发布时间】:2010-12-30 12:55:36
【问题描述】:
如果我不更改映射中的键/值,是否保证 map::iterator 的输出顺序?
例如,我用一些键/值初始化一个映射,然后执行一系列循环,并在每个循环中迭代映射并执行只读操作,每次迭代的输出是否相等?
for(i=0;i<5;i++)
for(it=map.begin(); it!=map.end(); it++)
// read some value from map
【问题讨论】:
如果我不更改映射中的键/值,是否保证 map::iterator 的输出顺序?
例如,我用一些键/值初始化一个映射,然后执行一系列循环,并在每个循环中迭代映射并执行只读操作,每次迭代的输出是否相等?
for(i=0;i<5;i++)
for(it=map.begin(); it!=map.end(); it++)
// read some value from map
【问题讨论】:
std::map 是一个有序集合。从begin() 迭代到end() 将始终按顺序返回映射条目。
顺序由map的比较运算符决定,默认为std::less<Key>。
一句话:是的。
【讨论】:
仅在修改操作(插入、擦除、清除)时修改顺序,其他操作不会影响排序
【讨论】:
std::map 保证被排序。如果内容不改变,地图排序也不应该改变。
我只能想到一种可能不会发生的场景:映射键是指针,比较函子取消引用键指向的对象以对它们执行比较操作。键未更改,但 do 指向的值(出于任何其他原因)。即使在那里,我也不确定标准是否强制 std::map 的实现仅在插入元素时评估比较。
【讨论】: