Is the order of iterating through std::map known (and guaranteed by the standard)?
我的意思是,我们知道
例子:
1 2 3 4 5 6 7 8 9 10 | 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; } |
是否保证打印
现实生活中的原因:我有一个带
编辑:我知道,
是的,那是有保证的。此外,
排序不是幸运的额外功能,而是数据结构的一个基本方面,因为排序用于确定两个键何时相同(根据上述规则),并执行有效的查找(本质上是一个二进制搜索,在元素数量上具有对数复杂性)。
这是由C++标准中的关联容器要求保证的。例如,在C++ 11中看到23.2.4/10:
1 2 3 4 5 6 | The fundamental property of iterators of associative containers is that they iterate through the containers in the non-descending order of keys where non-descending is defined by the comparison that was used to construct them. For any two dereferenceable iterators i and j such that distance from i to j is positive, value_comp(*j, *i) == false |
和23.2.4/11
1 2 | For associative containers with unique keys the stronger condition holds, value_comp(*i, *j) != false. |
我认为数据结构中存在混乱。
在大多数语言中,
然而,在C++中,情况并非如此:
std::map 是已排序的关联容器- EDCOX1(15)是在C++ 11中引入的基于哈希表的关联容器。
所以,为了澄清订货时的保证。
在C++ 03中:
std::set 、std::multiset 、std::map 和std::multimap 保证按钥匙(及提供的标准)订购。- 在
std::multiset 和std::multimap 中,本标准不对等价元素(即比较相等的元素)施加任何订单保证。
在C++ 11中:
std::set 、std::multiset 、std::map 和std::multimap 保证按钥匙(及提供的标准)订购。- 在
std::multiset 和std::multimap 中,标准规定等价元素(比较相等的元素)按插入顺序排列(首先插入) - 顾名思义,
std::unordered_* 集装箱没有订购。最值得注意的是,当修改容器时(插入/删除时),元素的顺序可能会改变。
当标准规定元素按某种方式排列时,意味着:
- 迭代时,可以看到元素的定义顺序
- 反向迭代时,可以看到元素的顺序相反。
我希望这能消除任何混乱。
Is this guaranteed to print 234 or it's implementation defined?
是的,
I'd like go iterate through all elements, with key, greater than a concrete int value.
这当然是可能的。
对。。。
也就是说,如果该类型的弱排序不明确(在您的情况下,使用整数作为键类型,这不是问题),则无法对
begin()可以给出最小的元素。但这取决于实施情况。它是在C++标准中指定的吗?如果没有,那么做出这种假设是危险的。