Вы используете функцию lower_bound
для поиска.Его назначение немного отличается от этого. Это - это то, что делает lower_bound:
Возвращает итератор, указывающий на первый элемент в отсортированном диапазоне [first, last), который сравнивается не меньше значения.
И еще одно определение из здесь :
В частности, он возвращает первую позицию, где значение может быть вставлено без нарушения порядка.
Так, например, если искомая вещь находится не в векторе, она вернет итератор, который указывает после последнего элемента в векторе, и этот итератор не может быть разыменован, потому что онне существует.
Взгляните на этот пример:
int myints[] = {10,20,30,30,20,10,10,20};
vector<int> v(myints,myints+8); // 10 20 30 30 20 10 10 20
vector<int>::iterator low;
sort (v.begin(), v.end()); // 10 10 10 20 20 20 30 30
low=lower_bound (v.begin(), v.end(), 60); // ^it will point here
cout << "lower_bound at position " << int(low- v.begin()) << endl;
Как видно из выходных данных, итератор будет указывать на 9-й элемент в векторе (индекс 8).Но вектор имеет только 8 элементов (с индексами 0-7).Это объясняется тем, что вы можете вставить новый элемент в вектор с индексом 8, не нарушая порядок.
Я думаю, что вам действительно нужна функция find
.Вот пример:
int myints[] = {10,20,30,30,20,10,10,20};
vector<int> v(myints,myints+8); // 10 20 30 30 20 10 10 20
vector<int>::iterator find_it1 = find(v.begin(), v.end(), 30);
vector<int>::iterator find_it2 = find(v.begin(), v.end(), 80);
if(find_it1 == v.end())
cout << "30 not found" << endl;
else
cout << "30 found at position " << int(find_it1 - v.begin()) << endl;
if(find_it2 == v.end())
cout << "80 not found" << endl;
else
cout << "80 found at position " << int(find_it2 - v.begin()) << endl;
Вот вывод:
30 found at position 2
80 not found