繁体   English   中英

结构向量的擦除元素

[英]Erase element of struct vector

给定用户定义的球衣号码,我正在尝试从playerRoster矢量中删除Team Roster元素。 .erase的问题是.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

我查看了cplusplus.com,发现c ++ 94和c ++ 11 iterator erase (const_iterator position);之间存在差异iterator erase (const_iterator position); (11), iterator erase (iterator position); (94)。 从我得到的错误中,看来我的编译器正在使用c ++ 11。

const_iterator是否意味着我必须在.erase()函数中使用常量,如果是,在这种情况下是否可以使用其他函数?

如果这不是问题,可以帮我弄清楚是什么吗?

如果您只想删除一个元素,则可以尝试以下代码:

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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM