std::map::find查找不存在的键未返回end()问题咨询
为什么std::map::find返回的迭代器解引用后得到不存在的键?
你的问题根源在于解引用了std::map::end()迭代器,这属于C++标准定义的未定义行为,所以会输出随机的垃圾值(比如你看到的1 , 0),而非预期的结果。
具体分析:
- 当输入
4 5时,你的pointsmap中仅存在键(4,5)。调用points.find({0,5})(x-4=0,y=5)时,因为该键不存在,find会返回points.end()——这个迭代器并不指向map中的任何有效元素,它只是一个“尾后”标记。 - 直接解引用
end()迭代器(比如prev_iter[0]->first.first)是完全不合法的操作,C++标准不对这种行为的结果做任何保证,它可能输出随机内存中的值、程序崩溃,或者出现其他奇怪的表现。你看到的1 , 0就是随机内存读出的垃圾数据。
正确的处理方式:
在解引用迭代器之前,必须先判断它是否等于end(),确认它指向有效元素后再访问:
#include <iostream> #include <array> #include <map> int main() { int x, y; std::map<std::pair<int,int>,bool> points; std::array<std::map<std::pair<int,int>,bool>::iterator, 4> prev_iter; std::cin >> x >> y; points[{x,y}] = false; prev_iter[0] = points.find({x-4, y}); if (prev_iter[0] != points.end()) { std::cout << prev_iter[0]->first.first << " , " << prev_iter[0]->first.second ; } else { std::cout << "目标键不存在,迭代器为end()"; } }
补充说明:
std::map::find的行为是符合预期的:当键不存在时,确实会返回end()迭代器。你的代码错误在于没有对返回值做合法性检查就直接访问,才导致了异常的输出。
内容的提问来源于stack exchange,提问作者eagerbeaver04
相关产品推荐
相关产品推荐

