提问人:WhiteGoat 提问时间:4/29/2020 更新时间:4/29/2020 访问量:98
STL map.find 返回所有元素
STL map.find returns all the elements
问:
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
由于某种原因,这两个元素都被检索到,并且此地图上没有其他修改/线程。 如果能提供一些帮助,将不胜感激:)
答:
1赞
Jarod42
4/29/2020
#1
查询应为
// 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
评论
0赞
WhiteGoat
4/29/2020
是的,就是这样,我在这里看了一眼一些代码:geeksforgeeks.org/map-find-function-in-c-stl 没有读太多
评论
std::map::find
只查找单个项目,因此无需迭代。也许你把它和std::map::equal_range
混淆了?(尽管这在多地图中更有用)