Удаление элемента из вектора с помощью std::erase и std::remove не работает с пользовательской структурой в качестве значения

Я пытаюсь удалить элемент из вектора, используя std::remove и std::erase. Я не знаю индекса, только значение. Однако это не работает, вероятно, это связано с операторами для моей пользовательской структуры, но я не знаю, как это исправить.

Проблема в этой строке кода:

stillAvailable.erase(remove(stillAvailable.begin(), stillAvailable.end(), previousRound[j]), stillAvailable.end());

Где StillAvailable имеет тип std::vector, а previousRound[j] имеет тип Team. Команда — это структура, которая выглядит следующим образом:

struct Team
{
  int country;
  std::string name;
  int positionGP;
  int groupID;
};

Я получаю следующие коды ошибок:

League.cc: In member function `bool League::generateSchema(int, std::vector<Team, std::allocator<Team> >)':
League.cc:131: error: no match for 'operator*' in '*temp'

C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h: In function `_OutputIterator std::remove_copy(_InputIterator, _InputIterator, _OutputIterator, const _Tp&) [with _InputIterator = __gnu_cxx::__normal_iterator<Team*, std::vector<Team, std::allocator<Team> > >, _OutputIterator = __gnu_cxx::__normal_iterator<Team*, std::vector<Team, std::allocator<Team> > >, _Tp = Team]':
C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:1114:   instantiated from `_ForwardIterator std::remove(_ForwardIterator, _ForwardIterator, const _Tp&) [with _ForwardIterator = __gnu_cxx::__normal_iterator<Team*, std::vector<Team, std::allocator<Team> > >, _Tp = Team]'
League.cc:145:   instantiated from here
C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:1037: error: no match for 'operator==' in '(&__first)->__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Team*, _Container = std::vector<Team, std::allocator<Team> >]() == __value'

C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h: In function `_RandomAccessIterator std::find(_RandomAccessIterator, _RandomAccessIterator, const _Tp&, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Team*, std::vector<Team, std::allocator<Team> > >, _Tp = Team]':
C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:314:   instantiated from `_InputIterator std::find(_InputIterator, _InputIterator, const _Tp&) [with _InputIterator = __gnu_cxx::__normal_iterator<Team*, std::vector<Team, std::allocator<Team> > >, _Tp = Team]'
C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:1112:   instantiated from `_ForwardIterator std::remove(_ForwardIterator, _ForwardIterator, const _Tp&) [with _ForwardIterator = __gnu_cxx::__normal_iterator<Team*, std::vector<Team, std::allocator<Team> > >, _Tp = Team]'

League.cc:145:   instantiated from here
C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:207: error: no match for 'operator==' in '(&__first)->__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Team*, _Container = std::vector<Team, std::allocator<Team> >]() == __val'

C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:211: error: no match for 'operator==' in '(&__first)->__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Team*, _Container = std::vector<Team, std::allocator<Team> >]() == __val'

C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:215: error: no match for 'operator==' in '(&__first)->__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Team*, _Container = std::vector<Team, std::allocator<Team> >]() == __val'

C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:219: error: no match for 'operator==' in '(&__first)->__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Team*, _Container = std::vector<Team, std::allocator<Team> >]() == __val'

C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:227: error: no match for 'operator==' in '(&__first)->__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Team*, _Container = std::vector<Team, std::allocator<Team> >]() == __val'

C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:231: error: no match for 'operator==' in '(&__first)->__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Team*, _Container = std::vector<Team, std::allocator<Team> >]() == __val'

C:/Dev-Cpp/include/c++/3.4.2/bits/stl_algo.h:235: error: no match for 'operator==' in '(&__first)->__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Team*, _Container = std::vector<Team, std::allocator<Team> >]() == __val'

Любая помощь будет принята с благодарностью! Заранее спасибо!


person rbnvrw    schedule 28.04.2012    source источник
comment
Что в строке 133? Какой-то указатель с *temp... пожалуйста, опубликуйте (укороченный) код.   -  person Sebastian Dressler    schedule 28.04.2012


Ответы (1)


std::remove использует operator==, который не перегружается автоматически для ваших классов и структур. Вам придется написать это самостоятельно:

bool operator==(const Team & lhs, const Team & rhs)
{
    // compare lhs and rhs in such a way that you return true if they
    // are equal, and false if they are not equal.  You can define
    // equal to mean whatever you want here.
}
person Benjamin Lindley    schedule 28.04.2012
comment
Большое спасибо!!! Я не знал, как определить такую ​​функцию, но ваш ответ мне очень помог! Еще раз спасибо! - person rbnvrw; 29.04.2012