Я пытаюсь получить итератор по некоторому ключу, используя метод std::map::find. Однако я получаю действительный итератор, но его первое значение пары, соответствующее ключу карты, не существует на карте. Вот код:
#include <iostream>
#include <array>
#include <map>
int main()
{
int x, y;
std::map<std::pair<int,int>,bool> points;
std::array<std::map<std::pair<int,int>,bool>::iterator, 4> prev_iter;
std::cin >> x >> y;
points[{x,y}] = false;
prev_iter[0] = points.find({x-4, y});
std::cout << prev_iter[0]->first.first <<" , "
<< prev_iter[0]->first.second ;
}
Я ввожу 2 целых числа 4 5
, на выходе получается 1 , 0
, но ключ (1,0) не существует в точках. В чем причина такого поведения?
Я ожидал получить points.end()
, потому что этого ключа в баллах не существует.
Вероятно, он указывает на end
, но вы никогда это не проверяете, а просто получаете доступ к итератору, поведение которого неопределенно.
@eagerbeaver04 Ваш код при запуске в отладочной сборке Visual C++ показывает «ошибку утверждения отладки». В этом вся суть неопределенного поведения, поскольку оно даже не выводит никакой информации. Так что то, что вы «ожидали», становится спорным вопросом.
«Я ожидал получить Points.end()», — вы это делаете. Почему вы думаете, что нет?
@ 463035818_is_not_an_ai Вероятным виновником является неправильное понимание того, что представляет собой конечный итератор.
Подождите, пока вы не обнаружите, что оператор map
[]
создает элементы, созданные по умолчанию, когда ключ не найден.
Когда map.find() не находит значение на карте, он возвращает map.end()
, что указывает «в никуда». Использование этого итератора, когда он указывает в никуда, является неопределенным поведением. В лучшем случае приложение выходит из строя, в худшем случае приложение продолжает работать в неправильном состоянии и выдает мусор. Всегда проверяйте .end()
:
#include <map>
#include <iostream>
int main()
{
std::map<int,int> map{{4,5}};
const auto it = map.find(1);
if (it != map.end())
{
std::cout << "value " << it->second << " found!" << '\n';
}
else
{
std::cout << "value not found!" << '\n';
}
}
значение не найдено
вы ДОЛЖНЫ проверить, что возврат
find
равен!= map.end()
, использование его, когда оно равно этому значению, является неопределенным поведением, это означает, что значение не найдено.