使用迭代器擦除向量中的元素

时间:2012-08-14 00:36:07

标签: c++ vector erase

我有以下向量来存储播放器类型的元素:

std::vector<player> players;

在一个叫做游戏的类中,它具有以下功能:

void game::removePlayer(string name) {
  vector<player>::iterator begin = players.begin();

  // find the player
  while (begin != players.end()) {
      if (begin->getName() == name) {
          break;
      }
      ++begin;
  }

  if (begin != players.end())
      players.erase(begin);

}

我收到以下错误:

    1>------ Build started: Project: texas holdem, Configuration: Debug Win32 ------
1>  game.cpp
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2514): error C2582: 'operator =' function is unavailable in 'player'
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2535) : see reference to function template instantiation '_OutIt std::_Move<_InIt,_OutIt>(_InIt,_InIt,_OutIt,std::_Nonscalar_ptr_iterator_tag)' being compiled
1>          with
1>          [
1>              _OutIt=player *,
1>              _InIt=player *
1>          ]
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector(1170) : see reference to function template instantiation '_OutIt std::_Move<player*,player*>(_InIt,_InIt,_OutIt)' being compiled
1>          with
1>          [
1>              _OutIt=player *,
1>              _InIt=player *
1>          ]
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector(1165) : while compiling class template member function 'std::_Vector_iterator<_Myvec> std::vector<_Ty>::erase(std::_Vector_const_iterator<_Myvec>)'
1>          with
1>          [
1>              _Myvec=std::_Vector_val<player,std::allocator<player>>,
1>              _Ty=player
1>          ]
1>          c:\vcprojects\texas holdem\texas holdem\game.h(29) : see reference to class template instantiation 'std::vector<_Ty>' being compiled
1>          with
1>          [
1>              _Ty=player
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

删除该行

players.erase(begin);

修复错误,为什么会发生错误,我该如何解决?

3 个答案:

答案 0 :(得分:1)

您需要为类Player重载赋值运算符Player & operator= (const Player & other)。这是必需的,因为erase要求它的参数是可复制的(它需要在删除后重新排列向量的其他元素)。

答案 1 :(得分:1)

正在发生的事情是库代码通过将每个数组元素推到迭代器下面的一个插槽中来移除player对象。为此,它使用operator =复制每个对象。显然,班级player没有那个操作员。

答案 2 :(得分:0)

问题是你的Player课程不可移动。为了从向量的中间删除Player,之后的所有Player必须向下移动向量中的一个空格。一种解决方案是不使用矢量。另一个是使Player可移动。