【问题标题】:STL map.find returns all the elementsSTL map.find 返回所有元素
【发布时间】:2020-08-13 11:26:28
【问题描述】:

遇到如下定义的 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++ dictionary stl find std


【解决方案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 从找到的键迭代直到结束(因此只有(可能)跳过第一个元素)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 2014-04-06
  • 2019-02-26
  • 1970-01-01
相关资源
最近更新 更多