You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

std::map::find查找不存在的键未返回end()问题咨询

为什么std::map::find返回的迭代器解引用后得到不存在的键?

你的问题根源在于解引用了std::map::end()迭代器,这属于C++标准定义的未定义行为,所以会输出随机的垃圾值(比如你看到的1 , 0),而非预期的结果。

具体分析:

  • 当输入4 5时,你的points map中仅存在键(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:01:09