2017-03-01 16 views
0

要素を、ユーザー定義のジャージー番号のplayerRosterベクトルから削除しようとしています。私が遭遇している問題は、.erase機能が動作していないことです。構造体ベクトルの要素を消去します

struct TeamRoster { 
    int jerseyNumber; 
    int playerRating; 
}; 

int numPlayers = 5; 
int searchValue = 0; 
vector<TeamRoster> playerRoster(numPlayers); 
TeamRoster newPlayer; 

unsigned int i = 0; 

cout << "Enter a jersey number: "; 
cin >> searchValue; 
cout << endl; 
for (i = 0; i < playerRoster.size(); ++i) { 
    if (playerRoster.at(i).jerseyNumber == searchValue) { 
     playerRoster.erase(i); 
    } 
} 

このエラーが発生しています。

main.cpp: In function 'int main()': 
main.cpp:68:36: error: no matching function for call to 'std::vector<main()::TeamRoster>::erase(unsigned int&)' 
      playerRoster.erase(i); 
           ^
In file included from /usr/include/c++/6/vector:64:0, 
      from main.cpp:2: 
/usr/include/c++/6/bits/stl_vector.h:1147:7: note: candidate: std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::erase(std::vector<_Tp, _Alloc>::const_iterator) [with _Tp = main()::TeamRoster; _Alloc = std::allocator<main()::TeamRoster>; std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<main()::TeamRoster*, std::vector<main()::TeamRoster> >; typename std::_Vector_base<_Tp, _Alloc>::pointer = main()::TeamRoster*; std::vector<_Tp, _Alloc>::const_iterator = __gnu_cxx::__normal_iterator<const main()::TeamRoster*, std::vector<main()::TeamRoster> >; typename __gnu_cxx::__alloc_traits<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type>::const_pointer = const main()::TeamRoster*] 
    erase(const_iterator __position) 
    ^~~~~ 
/usr/include/c++/6/bits/stl_vector.h:1147:7: note: no known conversion for argument 1 from 'unsigned int' to 'std::vector<main()::TeamRoster>::const_iterator {aka __gnu_cxx::__normal_iterator<const main()::TeamRoster*, std::vector<main()::TeamRoster> >}' 
/usr/include/c++/6/bits/stl_vector.h:1174:7: note: candidate: std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::erase(std::vector<_Tp, _Alloc>::const_iterator, std::vector<_Tp, _Alloc>::const_iterator) [with _Tp = main()::TeamRoster; _Alloc = std::allocator<main()::TeamRoster>; std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<main()::TeamRoster*, std::vector<main()::TeamRoster> >; typename std::_Vector_base<_Tp, _Alloc>::pointer = main()::TeamRoster*; std::vector<_Tp, _Alloc>::const_iterator = __gnu_cxx::__normal_iterator<const main()::TeamRoster*, std::vector<main()::TeamRoster> >; typename __gnu_cxx::__alloc_traits<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type>::const_pointer = const  main()::TeamRoster*] 
    erase(const_iterator __first, const_iterator __last) 
    ^~~~~ 
/usr/include/c++/6/bits/stl_vector.h:1174:7: note: candidate expects 2 arguments, 1 provided 

Iはcplusplus.comに見て、C++ 94とC++ 11 iterator erase (const_iterator position);(11)、iterator erase (iterator position);(94)との間の差に気づきました。私が得ているエラーから、私のコンパイラはC++ 11を使用しているようです。

const_iteratorは、.erase()関数で定数を使用する必要があることを意味します。この場合、この場合は別の関数が使用できますか?

これが問題でない場合は、何がわかるのか教えてください。

+3

'消去()' *イテレータ*、ではない '符号なしint'をとります。 – Biffen

+0

私はまだC++を学んでいますが、イテレータが何であるか、そしてそれを使う方法を学ぶべきか、あるいはstruct vectorから要素を削除する別の方法を見つけ出す方が良いでしょうか? –

+0

最近のC++ではイテレータがたくさん使われているので、それらを読み上げるのが最善でしょう。 – Biffen

答えて

0

消去したいだけ一つの要素の場合は、以下のコードを試みることができる:

for(auto iter = playerRoster.begin(); iter != playerRoster.end(); ++iter){ 
    if(iter->jerseyNumber == searchValue){ 
     iter = playerRoster.erase(iter); 
     break; 
    } 
} 

それとも、一致するすべての要素を消去したい場合は、あなたが試みることができる:

for(auto iter = playerRoster.begin(); iter != playerRoster.end();){ 
    if(iter->jerseyNumber == searchValue){ 
     iter = playerRoster.erase(iter); 
    }else{ 
     ++iter; 
    } 
} 

は、消去を忘れないでください消去された要素の後に要素を戻します。

サンプルコードを見つけることができる:http://www.cplusplus.com/reference/vector/vector/erase/

+0

サンプルコードには、 '.erase(myvector.begin()+ 5)'があります。 '.erase(playerRoster.bigin()+ i)'は動作しますか? –

+0

@JacobBischoffああ、はい、それは動作すると思います。通常、私はそのようにコードを書いていません。 – everettjf

関連する問題