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.
Bitte ** [edit] ** Ihre Frage mit [mcve] oder [SSCCE (kurz, eigenständiges, korrektes Beispiel)] (http://sscce.org) – NathanOliver
Es ist in meinem Beitrag. – Jthami05
Wo? Ich sehe keinen Code in dieser Frage. – NathanOliver