Ошибка времени выполнения - векторный итератор не разыменовывается? - PullRequest
1 голос
/ 03 апреля 2012

Для класса я создаю программу, которая управляет отелем. Я получаю ошибку во время выполнения, когда моя программа получает эту функцию: векторный итератор не разыменовывается. Я использовал отладчик, чтобы найти проблемную область, но я не могу понять, что с ним не так. Есть предложения?

Customer & ListOfCustomers::getByID(int id)
{
if(!sortedByID)sortByID();
vector<Customer>::iterator iter;

Customer cus;
cus.customerID=id;

iter = lower_bound(customers.begin(),customers.end(),cus,compareCustomersByID);

if(  (*iter).customerID == id ) // <---DEBUGGER SAYS ERROR HERE IN THIS LINE
{
    return *iter;
}
else
{
    return NullCustomer();
}
}

Вот функция lower_bound. Внутри #include алгоритм

template<class _FwdIt,
    class _Ty,
class _Pr> inline
_FwdIt lower_bound(_FwdIt _First, _FwdIt _Last,
    const _Ty& _Val, _Pr _Pred)
{// find first element not before _Val, using _Pred
//  _DEBUG_ORDER_PRED(_First, _Last, _Pred);
return (_Rechecked(_First,
    _Lower_bound(_Unchecked(_First), _Unchecked(_Last), _Val, _Pred,
            _Dist_type(_First))));
}

EDIT: добавлен пробел, чтобы функция lower_bound была правильно отформатирована как код.

1 Ответ

0 голосов
/ 18 апреля 2012

Вы используете функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...