2013-10-07 6 views
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

'end()' не последний элемент в контейнере, это волшебный маркер, представляющий один за другим. –

ответ

1

std::find возвращает end() если элемент не найден в контейнере STL, разыменование end() - это неопределенное поведение.

Вам необходимо проверить итератор it перед тем разыменованием оно:

it = find(a.begin(), a.end(), 180); 
if (it != a.end()) 
{ 
    cout << *it << endl; 
} 

§ 25.2.5

Возвращает: первый итератор я в диапазоне [первый, последний), для которых выполняется соответствующее условия сохраняются: * i == value, pred (* i)! = false, pred (* i) == false. Возвращает последний, если такой итератор не найден.

диапазон [first,last) приоткрыт диапазон, last означает end() не последний элемент в контейнере.

+0

возвращаемое значение: - Итератор для первого элемента в диапазоне, который сравнивается с валом. Если элементы не совпадают, функция возвращает последнее .... это то, что говорит веб-страница поиска C++ –

+0

, или последнее означает 'end()' в этом контексте – billz

+0

Нет, они дали код для поиска, что на самом деле означает, что это последний элемент, [ссылка] (http://www.cplusplus.com/reference/algorithm/find/) –

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; 
} 
Смежные вопросы