std::map中的find()函数返回一个值,尽管没有有效的键
The find() function from std::map returns a value despite not having a valid key
背景:我想使用std::pair
和std::map
创建一个状态图。
文档说明:
根据文件为地图::查找,我们知道:
返回值
元素的迭代器,该元素的键等效于键。如果没有这样的元素如果找到,则返回超过末尾(请参见end())的迭代器。
理念/逻辑:
我有一个简单的程序:
- 具有两个
enums
-- 一个用于状态
- 一个用于过渡
-
与CCD_ 4一起使用。
-
map
中的key
是std::pair
。pair
由初始状态和转换组成。 -
将
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
。
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 自定义先决条件对移动分配运算符有效吗
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 错误"Could not find Boost"(缺少:上下文标头)
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 为什么这种直接初始化有效?(C++17)
- 递归函数有效,但无法记忆
- find() 函数对集合有效吗?
- std::map中的find()函数返回一个值,尽管没有有效的键