Невозможно удалить элемент по ID из вектора не примитивных типов данных

У меня есть вектор моего пользовательского типа данных city, Я пытаюсь удалить элемент из этого вектора по его идентификатору; в конечном итоге все города будут удалены из этого списка в while(!cityList.empty()) петля. Я планирую использовать идиому удаления-удаления, чтобы выполнить это.

Тем не менее, я получаю очень грубое сообщение об ошибке, когда я делать мой код после звонка remove(), Проходя в city объект в качестве третьего параметра remove() приводит к этой ошибке, как и передача (int) ID city, Эта ошибка не возникает с erase(), но делает с remove(), а также find() если я попытаюсь использовать это. Вот код, о котором идет речь:

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

Вот обновленная простая, минимальная демонстрация моей проблемы.

Сообщение об ошибке включает в себя «не удалось вывести / заменить аргумент шаблона» а также «Город» не является производным от «const _gnu_cxx :: __ normal_iterator»<_IteratorL, _Container> ’» сообщений, и я не смог найти в Интернете ничего, касающегося моей проблемы с вышеуказанными ошибками.

Изменить: я изменил свой код так, что теперь у меня есть:

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

и ошибка, которую я получаю при попытке компиляции:

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

Это ближе, но я не уверен, что требуется. Линия main.cpp:30:90 указывает на cityList[i] == cityToRemove часть моей cityList.erase() функция, однако, поэтому я знаю, что проблема находится в моем выражении сравнения.

Моя демка также обновлена.

-2

Решение

Вы должны определить operator ==:

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

а также позвонить erase как в пример здесь.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector