STL map.find возвращает все элементы - PullRequest
1 голос
/ 29 апреля 2020

Возникла проблема с неопределенным поведением карты 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 Ответ

1 голос
/ 29 апреля 2020

Запрос должен быть

// 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 повторяется от найденного ключа до конца (поэтому только (потенциально) пропускает первые элементы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...