2016-09-23 2 views
-2

Ich habe einen Vektor meines benutzerdefinierten Datentyps city. Ich versuche, ein Element aus diesem Vektor durch seine ID zu entfernen; schließlich werden alle Städte aus dieser Liste in einer while(!cityList.empty()) Schleife entfernt. Ich plane, das Erase-Remove-Idiom zu verwenden, um dies zu erreichen.Element kann nicht nach ID aus Vektor nicht primitiver Datentypen entfernt werden

Allerdings bekomme ich eine sehr gnarly Fehlermeldung, wenn ich machen meinen Code nach dem Aufruf remove(). Die Übergabe des Objekts city als dritter Parameter an remove() führt zu diesem Fehler, ebenso wie die Übergabe der (int) ID von city. Dieser Fehler tritt nicht mit erase() auf, aber mit remove(), und auch find(), wenn ich versuche, das zu verwenden. Hier ist der Code in Frage:

vector<city> cityList; 
cityList.push_back(city(1)); 
cityList.push_back(city(2)); 
cityList.push_back(city(3)); 

city cityToRemove = cityList[0]; 
int idOfCityToRemove = cityList[0].getID(); 

remove(cityList.begin(), cityList.end(), cityToRemove); 
//remove(cityList.begin(), cityList.end(), idOfCityToRemove); 

Here is an updated simple, minimal demo of my problem.

Die Fehlermeldung enthält "Template-Argument Abzug/nicht bestanden Substitution" und " 'Stadt' nicht von 'const _gnu_cxx :: __ normal_iterator < _IteratorL, _container>' abgeleitet ist" Nachrichten, und ich habe nicht gewesen in der Lage, alles online zu meinem Problem mit den oben genannten Fehlern zu finden.

Edit: Ich habe meinen Code so verändert, dass ich jetzt habe:

int main(int argc, char** argv) { 

vector<city> cityList; 
cityList.push_back(city(1)); 
cityList.push_back(city(2)); 
cityList.push_back(city(3)); 

city cityToRemove = cityList[0]; 
int idOfCityToRemove = cityList[0].getID(); 
int i; 

for (i = 0; i < cityList.size(); i++) { 
    cityList.erase(remove_if(cityList.begin(), cityList.end(), cityList[i] == cityToRemove), cityList.end()); 
} 
//remove(cityList.begin(), cityList.end(), cityToRemove); 
//remove(cityList.begin(), cityList.end(), idOfCityToRemove); 

return 0; 
} 

bool operator ==(const city &a, const city &b) 
{ 
    return (a.id == b.id); 
} 

und die Fehler, die ich erhalten, wenn man versucht ist zu kompilieren:

In file included from /usr/include/c++/5/bits/stl_algobase.h:71:0, 
      from /usr/include/c++/5/bits/char_traits.h:39, 
      from /usr/include/c++/5/ios:40, 
      from /usr/include/c++/5/ostream:38, 
      from /usr/include/c++/5/iostream:39, 
      from main.cpp:2: 
/usr/include/c++/5/bits/predefined_ops.h: In instantiation of ‘bool __gnu_cxx::__ops::_Iter_pred<_Predicate>::operator()(_Iterator) [with _Iterator = __gnu_cxx::__normal_iterator<city*, std::vector<city> >; _Predicate = bool]’: 
/usr/include/c++/5/bits/stl_algo.h:866:20: required from _ForwardIterator std::__remove_if(_ForwardIterator, _ForwardIterator, _Predicate) [with _ForwardIterator = __gnu_cxx::__normal_iterator<city*, std::vector<city> >; _Predicate = __gnu_cxx::__ops::_Iter_pred<bool>]’ 
/usr/include/c++/5/bits/stl_algo.h:936:30: required from ‘_FIter std::remove_if(_FIter, _FIter, _Predicate) [with _FIter = __gnu_cxx::__normal_iterator<city*, std::vector<city> >; _Predicate = bool]’ 
main.cpp:30:90: required from here 
/usr/include/c++/5/bits/predefined_ops.h:234:30: error: expression cannot be used as a function 
{ return bool(_M_pred(*__it)); } 
         ^

Dies ist näher, aber ich Ich bin mir nicht sicher, was erforderlich ist. Die Zeile main.cpp:30:90 zeigt auf den cityList[i] == cityToRemove Teil meiner cityList.erase() Funktion, aber ich weiß, dass das Problem in meinem Vergleichsausdruck liegt.

Meine Demo ist ebenfalls aktualisiert.

+2

Bitte ** [edit] ** Ihre Frage mit [mcve] oder [SSCCE (kurz, eigenständiges, korrektes Beispiel)] (http://sscce.org) – NathanOliver

+0

Es ist in meinem Beitrag. – Jthami05

+0

Wo? Ich sehe keinen Code in dieser Frage. – NathanOliver

Antwort

0

Sie benötigen einen operator == zu definieren:

class city { 
    public: 
     city(int idin); 
     int getID(); 

    private: 
     int id; 

    friend bool operator==(const city &a, const city &b); 
}; 

.

bool operator ==(const city &a, const city &b) 
{ 
    return a.id == b.id; 
} 

und rufen auch erase wie im example here.

+0

Die Überladungsfunktion des Operators zu meiner Klasse hinzufügen und sie in main.cpp mit einer for-Schleife aufrufen als 'cityList.resease (remove_if (cityList.begin(), cityList.end(), cityList [i] == cityToRemove), cityList .end()); 'verringernSie die Anzahl der Fehler, aber ich erhalte immer noch den Fehler" erforderlich von '_ForwardIterator "und kann nicht kompilieren. – Jthami05

+0

Geben Sie den neuen Code ein, dann? Und die vollständige Fehlermeldung. – smead

+0

Mein ursprünglicher Beitrag wurde aktualisiert. – Jthami05

Verwandte Themen