<分区>
背景:
我想使用 std::pair
和 std::map
创建一个状态图。
文档说:
根据 map::find 的文档,我们知道:
Return value
Iterator to an element with key equivalent to key. If no such element is found, past-the-end (see end()) iterator is returned.
想法/逻辑:
我有这个简单的程序:
- 有两个
枚举
-- 各州和,
- 一个用于过渡,
与
map
一起使用。map
中的key
是一个std::pair
。对
由初始状态和转换组成。在上面的
key
上应用find
,我们可以得到下一个状态。
代码:
代码如下:
#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_Undefined,所以我进行了初始化。
注意:
我明白了,我应该像这样检查main()
函数中的迭代器,这样就可以避免这种情况。
if (myMap.end() == myMap.find(InitStateAndTransition(nextState, testInput))) {
return -1;
}
问题:
但是,我只是不明白,find()->second
如何或为什么可以返回 0
a.k.a 枚举 State_Undefined
.我从不将该值放入哈希表中。