c++ - STL map.find 返回所有元素
问题描述
定义如下的 STL 映射的未定义行为存在问题:
typedef bool (*SNAPSHOT_CALLBACK)(/*Some params here..*/);
typedef std::map<DWORD, SNAPSHOT_CALLBACK> SnapshotsMap;
SnapshotsMap m_mapCallbacks;
插入:
AddCallback(DWORD snapshotType, SNAPSHOT_CALLBACK callback)
m_mapCallbacks.insert(std::pair<DWORD, SNAPSHOT_CALLBACK>(snapshotType, callback));
和查询:
for (auto itr = m_mapCallbacks.find(cpyHeader->hdr); itr != m_mapCallbacks.end(); itr++)
{
itr->second();
}
我遇到的问题是在单个键搜索中,迭代器会检索我插入的两个键。我的日志:
Insert:
Added callback type: 21000b Callback: 615F5AE0
Added callback type: 210136 Callback: 615F5480
Query:
Same iterator loop:
Key to find: 21000b -> FOUND First: 21000b Second: 61da5ae0
Key to find: 21000b -> FOUND First: 210136 Second: 61da5480
由于某种原因,这两个元素都被检索到,并且此地图上没有其他修改/线程。一些帮助将不胜感激:)
解决方案
查询应该是
// C++17 if construct
if (auto itr = m_mapCallbacks.find(cpyHeader->hdr); itr != m_mapCallbacks.end())
{
itr->second();
}
或者
// pre-C++17 (but C++11 for auto)
auto itr = m_mapCallbacks.find(cpyHeader->hdr);
if (itr != m_mapCallbacks.end())
{
itr->second();
}
您for
从找到的键迭代直到结束(所以只有(可能)跳过第一个元素)
推荐阅读
- sql-server - SQL Server 2016:从 sys.messages 中选择时出错
- sql-server - 为什么存储过程中的 TRY-CATCH 语句不起作用?
- security - 自定义用户联合提供程序中的 Keycloak 角色解析
- reactjs - 我无法访问 reactjs 中的类属性
- mysql - 如何修复此 SQL 无效组函数错误?
- pandas - Docker 多阶段构建,python 和 java
- html - CSS显示类的内容?
- laravel-5 - 将文件放入 Laravel 5.8
- python - 如何使用python在aws中执行跨账户(使用角色arn)?
- java - 如何重新排列数组以从中间开始?