如何从矢量C ++中查找和删除项目

时间:2014-12-26 16:27:24

标签: c++ vector

我有一个矢量:

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需要索引。

3 个答案:

答案 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中建议要注意指针容器上类似删除的算法,并建议使用智能指针的容器而不是原始指针的容器。 基于擦除删除习惯用法的代码示例如下:

  1. 声明一个函数来检查向量中是否存在theFriend并将其删除(仿函数更合适):<​​/ p>

    void delAndNullifyFirend(User *&amp; pUser`){//检查朋友的存在并删除}

  2. `

    for_each(myFriends_.begin(),myFriends_.end(), delAndNullifyFirend);`
    myFriends_.erase(remove(myFriends_.begin(),myFriends_.end(),static_cast<User*>(0)),
                         myFriends_.end());