Ожидаемый возврат алгоритма поиска STL

0
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, он должен вернуть последнее значение, но когда я распечатаю это значение, он придет к чему-то мусору. Похоже, что итератор указывает на другое место. Пожалуйста, помогите мне определить мою ошибку.

Теги:
stl

2 ответа

1
Лучший ответ

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() не последний элемент в контейнере.

  • 0
    возвращаемое значение: - Итератор первого элемента в диапазоне, который сравнивается с val. Если ни один элемент не совпадает, функция возвращает последнее ... это то, что говорит веб-страница find c ++
  • 0
    или последнее означает end() в этом контексте
Показать ещё 3 комментария
2

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;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню