2012-04-03 8 views
1

Für Klasse, ich mache ein Programm, das ein Hotel verwaltet. Ich erhalte einen Laufzeitfehler, wenn mein Programm zu dieser Funktion kommt: Vektoriterator nicht dereferenzierbar. Ich habe den Debugger verwendet, um den Problembereich zu finden, aber ich kann nicht herausfinden, was damit nicht stimmt. Irgendwelche Vorschläge?Laufzeitfehler - Vector Iterator nicht dereferenzierbar?

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

Hier ist die Funktion lower_bound. Es befindet sich in # include Algorithmus

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: hat einen Raum, so dass die lower_bound Funktion korrekt als Code formatiert werden würde.

+1

Vielleicht 'iter == customers.end()'? – quasiverse

+0

@quasiverse Ich bekomme immer noch den gleichen Fehler, wenn ich versuche, das – Mike

+0

Wie Quasicverse sagte, meine Vermutung ist, dass der Iter-Zeiger nicht korrekt ist. Außerdem wäre es sinnvoll, die Funktion lower_bound zu posten. – RStrad

Antwort

0

Sie verwenden die lower_bound Funktion für die Suche. Sein Zweck ist ein wenig anders als das. This ist, was lower_bound tut:

Gibt einen Iterator auf das erste Element im sortierten Bereich zeigt [first, last), die nicht kleiner als der Wert nicht vergleichen.

Und eine andere Definition von here:

Insbesondere es gibt die erste Position, in der Wert ohne Verletzung der Ordnung eingefügt werden könnte.

So zum Beispiel, wenn das Ding Sie suchen, ist nicht in dem Vektor, wird es einen Iterator zurück, die nach das letzte Element in dem Vektor zeigt, und dass Iterator kann nicht, weil es dereferenziert werden ist nicht vorhanden.

Werfen Sie einen Blick auf dieses Beispiel:

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; 

Wie Sie aus der Ausgabe sehen können, der Iterator zum 9. Element in dem Vektor (Index 8) verweisen. Aber der Vektor hat nur 8 Elemente (indiziert 0-7). Die Erklärung hierfür ist, dass Sie das neue Element in den Vektor bei Index 8 einfügen können, ohne die Reihenfolge zu verletzen.

Ich denke, dass was Sie wirklich wollen, ist die find Funktion. Hier ein Beispiel:

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; 

Hier ist der Ausgang:

30 found at position 2 
80 not found 
Verwandte Themen