【发布时间】:2011-11-30 17:11:03
【问题描述】:
我的意思是——我们知道std::map 的元素是根据键排序的。所以,假设键是整数。如果我使用for 从std::map::begin() 迭代到std::map::end(),标准是否保证我将使用键依次遍历元素,并按升序排序?
例子:
std::map<int, int> map_;
map_[1] = 2;
map_[2] = 3;
map_[3] = 4;
for( std::map<int, int>::iterator iter = map_.begin();
iter != map_.end();
++iter )
{
std::cout << iter->second;
}
这是保证打印234 还是实现定义?
现实生活中的原因:我有一个std::map 和int 键。在非常罕见的情况下,我想遍历所有元素,其中 key 大于具体的 int 值。是的,听起来std::vector 会是更好的选择,但请注意我的“非常罕见的情况”。
编辑:我知道,std::map 的元素已排序.. 无需指出(对于此处的大多数答案)。我什至在我的问题中写了它。
我在遍历容器时询问了迭代器和顺序。感谢@Kerrek SB 的回答。
【问题讨论】:
-
如果您不知道:在您的实际使用中,您可以使用
map::upper_bound找到开始迭代的点。 -
我知道这一点,我知道我要开始迭代的确切位置。我只是在保证订单的情况下徘徊。
-
如果您的键(数字索引)全面变化很大,那么稀疏向量将不明智。我正在使用类似的解决方案,其中数字索引表示 3 维空间中的笛卡尔 y 坐标。在这种情况下使用向量会使我的内存占用增加千兆字节。所以我不认为向量在这里是灵丹妙药,远非如此。
-
我不明白这个问题,我会通过思想实验来解释原因。如果你已经知道元素是有序的,迭代怎么可能不呢?如果它不适用于迭代,排序甚至意味着什么?还有哪些其他情况下订单很重要,可以检测到等? (答案由Konstantin给出。)
标签: c++ dictionary stl standards