std::map中的find()函数返回一个值,尽管没有有效的键

The find() function from std::map returns a value despite not having a valid key

本文关键字:有效 find 中的 map 函数 返回 std 一个      更新时间:2023-10-16

背景:我想使用std::pairstd::map创建一个状态图。

文档说明:

根据文件为地图::查找,我们知道:

返回值

元素的迭代器,该元素的键等效于键。如果没有这样的元素如果找到,则返回超过末尾(请参见end())的迭代器。

理念/逻辑

我有一个简单的程序:

  • 具有两个enums-
    • 一个用于状态
    • 一个用于过渡
  • 与CCD_ 4一起使用。

  • map中的keystd::pairpair由初始状态和转换组成。

  • find应用于上述key,我们可以得到下一个状态。

代码

这是代码:

#include <utility>
#include <map>
#include <iostream>
typedef enum {
State_Undefined = 0,
State_NotConnected = 1,
State_Transporting = 2,
State_TransportFinished = 3,
State_TransportStopped = 4
} State;
typedef enum {
Transition_Undefined = 0,
Transition_StopTransport = 1,
Transition_StartTransport = 2,
Transition_FinishTransport = 3
} Transition;
typedef std::pair<const State, const Transition> InitStateAndTransition;
typedef std::map<InitStateAndTransition, State> NextStateFromCurrentStateAndTransition;
NextStateFromCurrentStateAndTransition myMap = {
{{State_NotConnected, Transition_StartTransport}, State_Transporting},
{{State_Transporting, Transition_StopTransport}, State_TransportStopped},
{{State_TransportStopped, Transition_FinishTransport}, State_TransportFinished},
{{State_TransportStopped, Transition_StartTransport}, State_Transporting}
};
int main()
{
State currentState = State_NotConnected;
Transition testInput = Transition_StartTransport;
State nextState = myMap.find(InitStateAndTransition(currentState, testInput))->second;
std::cout << nextState << std::endl;
testInput= Transition_StartTransport;
nextState = myMap.find(InitStateAndTransition(nextState, testInput))->second;
std::cout << nextState << std::endl;
return 0;
}

令人惊讶的是,这返回了输出

2

0

我想0代表State_Undefined。这令人惊讶。由于哈希表中没有State_Undefine,我本来预计会出现错误或警告,所以我进行了初始化。

注意:

我知道,我应该像这样检查main()函数中的迭代器,这样就可以避免这种情况。

if (myMap.end() == myMap.find(InitStateAndTransition(nextState, testInput))) {
return -1;
}

问题

但是,我只是不明白find()->second如何或为什么可以返回0,也就是枚举State_Undefined。我从来没有把这个值放在哈希表中。

错误是您没有检查find的结果。如果返回的迭代器等于end(),则取消引用它是未定义的行为。

在这种情况下,它只是随机返回0。可能是-1。或者撞车。或者其他什么。

这令人惊讶。由于哈希表中没有State_Undefine,我本来预计会出现错误或警告,所以我进行了初始化。

间接越过结束迭代器的行为是未定义的。期望某些特定的行为是错误的。

但是,我只是不明白find()->second如何或为什么可以返回0,也就是枚举State_Undefined。我从来没有把这个值放在哈希表中。

行为未定义。任何事情都有可能发生。


如果您想在元素不存在时发生异常,可以使用map::at而不是map::find