map迭代器使用困惑:为何程序运行结果不符合预期?
关于降序map迭代器行为的解惑
嘿,我来帮你把这个map迭代器的逻辑理清楚~
首先得明确一个核心点:当你给map设置了从大到小的排序规则后,它的迭代器行为和默认升序map是反向的:
- 默认升序map的
begin()指向键最小的元素,end()是尾后迭代器(不指向任何有效元素),迭代器++操作会让它往键更大的方向移动; - 而你定义的降序map,
begin()指向的是键最大的元素,迭代器++操作会让它往键更小的方向移动,直到抵达end()。
你说执行x++后预期输出0但结果不符,大概率是这两个原因之一:
- 你的map
cnt里根本没有键为0的元素:迭代器只会遍历map中已存在的元素,按降序依次移动。比如如果你的map里只有{5, ...}, {3, ...}, {1, ...},那begin()是5,x++后是3,再++是1,再++就到end()了——这时候如果还访问x->first,属于未定义行为,结果完全不可控。 - 0不是当前迭代器移动后的下一个元素:比如你的map里有
{10, ...}, {5, ...}, {0, ...},那begin()是10,x++后是5,再++才会到0,而不是第一次++就到0。
另外一定要注意:每次移动迭代器后,必须先判断迭代器是否等于cnt.end(),只有不等于的时候,才能安全访问x->first或x->second,否则会触发未定义行为(程序崩溃、输出乱码都有可能)。
举个简单的代码例子帮你理解:
#include <iostream> #include <map> using namespace std; int main() { // 定义降序排序的map map<int, int, greater<int>> cnt; cnt[5] = 1; cnt[3] = 1; cnt[0] = 1; auto x = cnt.begin(); cout << x->first << endl; // 输出5,因为降序begin是最大键 x++; cout << x->first << endl; // 输出3,下一个更小的键 x++; cout << x->first << endl; // 输出0,这时候才到你预期的0 x++; // 此时x == cnt.end(),不能再访问x->first! return 0; }
内容的提问来源于stack exchange,提问作者scubnoob
相关产品推荐
相关产品推荐

