我有一个矢量:
std::vector<User*> myFriends_;
然后我有代码来查看向量中是否存在元素theFriend
。
if (std::find(myFriends_.begin(), myFriends_.end(), theFriend)!=myFriends_.end())
return FAILURE;
我想做一些像
这样的事情User* toErease;
toErease=std::find(myFriends_.begin(), myFriends_.end(), theFriend);
if (toErease!=myFriends_.end())
return FAILURE;
myFriends_.erase(toErease); /// remove this element if its precent
它会起作用吗?
find
返回元素的位置
据我所知,erase
需要索引。
答案 0 :(得分:7)
std::find(myFriends_.begin(), myFriends_.end(), theFriend);
返回类型为std::vector<User*>::iterator
所以,你需要
std::vector<User*>::iterator toErease ;
toErease=std::find(myFriends_.begin(), myFriends_.end(), theFriend);
// And then erase if found
if (toErease!=myFriends_.end())
{
/* Since container element is a pointer to User
you need to destroy it too ! */
delete *toErease ;
myFriends_.erase(toErease);
//... return SUCCESS ;
}
return FAILURE ;
答案 1 :(得分:1)
我认为你的意思是以下
User *theFriend = new User( /*...*/ );
//...
auto it = std::find_if( myFriends_.begin(), myFriends_.end(),
[&]( User *user ) { return *user == *theFriend; } );
if ( it != myFriends_.end() )
{
delete *it;
myFriends_.erase( it );
}
考虑到用户类应具有operator ==
,或者您应该使用其他一些lambda表达式来按照某些标准比较用户。
答案 2 :(得分:0)
有效的STL书在他的项目33 p 120中建议要注意指针容器上类似删除的算法,并建议使用智能指针的容器而不是原始指针的容器。 基于擦除删除习惯用法的代码示例如下:
声明一个函数来检查向量中是否存在theFriend并将其删除(仿函数更合适):</ p>
void delAndNullifyFirend(User *&amp; pUser`){//检查朋友的存在并删除}
`
for_each(myFriends_.begin(),myFriends_.end(), delAndNullifyFirend);`
myFriends_.erase(remove(myFriends_.begin(),myFriends_.end(),static_cast<User*>(0)),
myFriends_.end());