C++ 遍历std::map的顺序是否已知(并由标准保证)?

C++ 遍历std::map的顺序是否已知(并由标准保证)?,c++,dictionary,stl,standards,C++,Dictionary,Stl,Standards,我的意思是-我们知道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(); ite

我的意思是-我们知道
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;
}
std::map\ux;
图[1]=2;
图[2]=3;
map_u3]=4;
for(std::map::iterator iter=map_u2;.begin();
iter!=map_uz.end();
++国际热核聚变实验堆(iter)
{
std::cout秒;
}
是否保证打印
234
,或者是否定义了实现


现实生活中的原因:我有一个带有
int
键的
std::map
。在非常罕见的情况下,我希望使用key遍历大于具体
int
值的所有元素。是的,听起来像是
std::vector
将是更好的选择,但请注意我的“非常罕见的情况”


EDIT:我知道,
std::map
的元素已排序。。无需指出(这里的大多数答案)。我甚至把它写在我的问题中。
在遍历容器时,我询问了迭代器和顺序。谢谢@Kerrek SB的回答

是否保证打印234或其实现已定义

是,
std::map
是一个已排序的容器,由
和提供的
比较器
排序。所以这是有保证的

我想用key遍历所有大于具体int值的元素


那当然是可能的。

是的。。。a
std::map
中的元素具有严格的弱顺序,这意味着元素将由一组组成(即,不会有“相等”的键的重复),相等性是通过对任意两个键a和B进行测试来确定的,如果键a不小于键B,且B不小于键a,则键a等于键B


也就是说,如果
std::map
类型的弱排序不明确(在您的情况下,使用整数作为键类型,这不是问题),则无法正确排序该类型的元素。您必须能够定义一个操作,该操作定义了用于
std::map
中键的类型的总顺序,否则您的元素或偏序集将只有部分顺序,其中的属性A可能无法与B进行比较。在这种情况下,通常会发生的情况是,您可以插入键/值对,但如果您遍历整个映射,和/或在尝试执行
std::map::find()时检测到“缺少”键/值对,则可能最终会出现重复的键/值对
映射中的特定键/值对。

是的,这是有保证的。此外,
*begin()
为您提供了由比较运算符确定的最小元素和最大元素,以及表达式
对应的两个键值
a
b
!比较(a,b)&!比较(b,a)
为真,则视为相等。默认比较函数是
std::less


排序不是幸运奖金功能,而是数据结构的一个基本方面,因为排序用于确定两个键何时相同(根据上述规则),并执行高效查找(基本上是二进制搜索,在元素数量上具有对数复杂性).

我认为数据结构存在混乱

在大多数语言中,
map
只是一个AssociationContainer:它将一个键映射到一个值。在“较新”的语言中,这通常是使用哈希映射实现的,因此不保证顺序

在C++中,这不是这样的:

  • std::map
    是一个排序的关联容器
  • 无序映射是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.*
    容器,顾名思义,不是有序的。最值得注意的是,当修改容器时(插入/删除时),元素的顺序可能会改变
当标准规定元素以某种方式排列时,意味着:

  • 迭代时,您将看到按定义顺序排列的元素
  • 当反向迭代时,可以看到相反顺序的元素

我希望这能消除任何混淆。

< P>这是由C++标准中的关联容器需求来保证的。例如,参见C++11中的23.2.4/10:

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 关联容器的迭代器的基本特性是 按键的非降序遍历容器,其中 非降序是通过用于构造它们的比较来定义的。 对于任意两个可解引用迭代器i和j,从i到j的距离为 肯定的,, 值_comp(*j,*i)=假 和23.2.4/11

For associative containers with unique keys the stronger condition holds, value_comp(*i, *j) != false. 关联conta