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

标签 c++ enums hashtable stdmap std-pair

<分区>

背景: 我想使用 std::pairstd::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 .我从不将该值放入哈希表中。

最佳答案

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

在这种情况下,它只是随机返回 0。它可能是 -1。或者崩溃。或其他任何内容。

关于c++ - std::map 中的 find() 函数返回一个值,尽管没有有效的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54079007/

相关文章:

arrays - PowerShell 中的 JSON 数组

C# 在哈希表中查找键并收集相应的值

xml - 处理 JAXB 枚举键名

c# - 详尽开关的编译器错误

c++ - 为什么要在 C++ 中初始化静态类变量?

c++ - 关闭函数时返回 vs break?

c++ - 期望一个类或命名空间;语法正确

powershell - Powershell-与Containskey和哈希表的设置值匹配不起作用

c++ - 在 3D 环境中识别模式

c++ - std::pmr::polymorphic_allocator 的模板参数有什么用途?