list< int > a;
list < int > ::iterator it;
it = a.begin();
it=a.insert(it,10);
it=a.insert(it,210);
it=a.insert(it,310);
it=a.insert(it,410);
it=a.insert(it,510);
it = find(a.begin(),a.end(),180);
cout << *it << endl;
В этой программе значение 180 отсутствует в этом списке. Таким образом, согласно алгоритму поиска STL, он должен вернуть последнее значение, но когда я распечатаю это значение, он придет к чему-то мусору. Похоже, что итератор указывает на другое место. Пожалуйста, помогите мне определить мою ошибку.
std::find
возвращает end()
если элемент не найден в контейнере STL, dereference end()
- неопределенное поведение.
Вы должны проверить итератор it
, прежде чем разыменовать ему:
it = find(a.begin(), a.end(), 180);
if (it != a.end())
{
cout << *it << endl;
}
Статья 25.2.5
Возвращает: первый итератор я в диапазоне [первый, последний], для которого выполняются следующие соответствующие условия: * я == value, pred (* i)! = False, pred (* i) == false. Возвращает последний, если такой итератор не найден.
диапазон [first,last)
- половина открытого диапазона, last
означает end()
не последний элемент в контейнере.
a.end()
не является итератором для последнего значения, а итератором, прошедшим последний элемент в списке. Его ни в коем случае нельзя печатать и не получать. В случае std::find
вы должны сравнить возвращаемое значение с конечным итератором. Если он совпадает, в этом контейнере нет элемента, который соответствует запрашиваемому значению.
it = find(a.begin(),a.end(),180);
if( a.end() == it ) { // using Yoda conditional
cout << "no element matching value.." << endl;
} else {
cout << *it << endl;
}
end()
в этом контексте