是 - >为迭代器my_map.end()定义的第二个?

Raw*_*ler 11 c++ iterator stl

我正在和一个人一起工作std::map<std::string, MyClass* >.

我想测试是否my_map.find(key)返回特定指针.

现在我正在做;

auto iter = my_map.find(key);
if ((iter != my_map.end()) && (iter->second == expected)) {
    // Something wonderful has happened
}
Run Code Online (Sandbox Code Playgroud)

但是,operator *迭代器的位置需要返回引用.直觉我认为它是有效的并完全初始化?如果是这样,那my_map.end()->second将是NULL,并且(因为NULL从未预料到),我可以将我的if语句减少为:

if (iter->second == expected)
Run Code Online (Sandbox Code Playgroud)

这是否符合规范?有没有人有实际经验?恕我直言,代码变得更加清晰,可能会实现微小的性能提升.

And*_*owl 12

直觉我认为它是有效的并完全初始化?

您不能假设一个迭代器到一个容器的过去结束的元素是可解除引用的.根据C++ 11标准的第24.2.1/5段:

就像指向数组的常规指针一样,保证指针值指向数组的最后一个元素,因此对于任何迭代器类型,都有一个迭代器值指向相应序列的最后一个元素.这些值称为past-the-end值.定义i表达式的迭代器的值*i称为可解除引用.库从不假设过去的值是可解除引用的.[...]