2012-04-03 2 views
1

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

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

Возможно, 'ITER == customers.end()'? – quasiverse

+0

@quasiverse Я до сих пор получаю ту же ошибку, когда я пытаюсь применить это – Mike

+0

Как и в случае с квази-обращением, я предполагаю, что указатель iter неверен. Кроме того, было бы полезно опубликовать функцию lower_bound. – RStrad

ответ

0

Вы используете функцию lower_bound для поиска. Его назначение немного отличается от этого. This что lower_bound делает:

Возвращает итератор, указывающий на первый элемент в отсортированном диапазоне [первый, последний), который не сравнить меньше значения.

И еще одно определение из here:

В частности, он возвращает первую позицию, где значение может быть вставлено, не нарушая порядок.

Так, например, если вещь, которую вы ищете не в векторе, он возвращает итератор, указывающий после последнего элемента в векторе, и что итератор не может быть потому, что он разыменовывается не существует.

Взгляните на этот пример:

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