这是正常的= map.find(element)== map.end()有吗 - >秒?

时间:2013-11-28 18:28:53

标签: c++ map iterator

我很惊讶在地图中不存在的元素迭代时遇到EXC_BAD_ACCESS异常。当我试图在迭代器上获得it->second时,它不会倒下,实际上是map.end()。它确实倒下了,试图达到一些不好的记忆。 我很想知道如何实现迭代器结束,以及如何摆脱这样的问题。总是只检查if (iterator == map.end ())吗?

#include <iostream>
#include <map> 
using namespace std;

int main(int argc, const char * argv[])
{
    map<int, map<int, bool>> big_map;
    map<int, bool> small_map;

    small_map.insert(make_pair(1,1));
    big_map.insert(make_pair(1, small_map));

    auto non_exist = big_map.find(0);
    for (auto i = non_exist->second.begin(); i != non_exist->second.end(); ++i) {
        cout << i->second << endl;
    }
    return 0;
}

我的输出:

  

1
  1
  0
  然后EXC_BAD_ACCESS然后

2 个答案:

答案 0 :(得分:2)

non_exist->second时,

non_exist == big_map.end()是未定义的行为。你必须在开始循环之前检查一下。

答案 1 :(得分:1)

这还不够,您应该先检查non_exist != big_map.end()

auto non_exist = big_map.find(0);

if (non_exist != big_map.end())
{
    for (auto i = non_exist->second.begin(); i != non_exist->second.end(); ++i) {
        cout << i->second << endl;
    }
}