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中引入的一种基于哈希表的关联容器
、std::set
、std::multiset
和std::map
保证根据键(和提供的标准)订购std::multimap
- 在
和std::multiset
中,本标准不对等效元件(即比较相等的元件)施加任何顺序保证std::multimap
、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