Ошибка в map.find

243
22 декабря 2017, 02:20

Всем привет, вот есть фрагмент кода, в котором идёт проверка на находимость в мапе похожего ключа, если тип нашёл то возвращает минус 1, не нашёл 1. Мб я чёт не правильно догоняю. Но функция find возвращает итератор. Вылетает в этом коде.

auto search = TableCarryGroup.find(CALLSIGN);
    if((*search).first == CALLSIGN){
        return 1;
    } else
        return -1;
Answer 1

Когда элемент не найден, то возвращается итератор на элемент после конца. Обращение к данным через такой итератор недопустимо (поэтому вылетает).

Правильно было бы сделать так:

if(TableCarryGroup.find(CALLSIGN) != TableCarryGroup.end())
    return 1;
else
    return -1;

Вообще, если у вас есть некий код, который ищет значение в мапе а потом использует его, то правильный паттерн:

auto iter = map.find(key);
if(iter != map.end())
{
    // Используем данные
}
else
{
    // Вариант когда элемент не найден. Обращяться к данным через итератор нельзя.
}
Answer 2

Если нужна ТОЛЬКО проверка, можно использовать функцию count() - вернет 0, если элемента нет. Работает в map, set.

READ ALSO
поиск строк в txt файле

поиск строк в txt файле

Дан txt файл, с названием filetxt на рабочем столе

232
Qt5 C++11 расположение элементов, QGridLayout

Qt5 C++11 расположение элементов, QGridLayout

Располагаю элементы в своём приложении с QGridLayout

254
Разница между delete и operator delete

Разница между delete и operator delete

В чём разница между этими действиями?

302
DCE/RPC - узнать переменные окружения или расположения системных папок

DCE/RPC - узнать переменные окружения или расположения системных папок

Можно ли с помощью DCE/RPC узнать нужные переменные окружения или пути к системных папкам, таким как c:program file или home user directory?

222