std :: remove_if:从std :: vector中删除指针的所有出现

F. *_*mir 2 c++ stdvector

我有一个std :: vector实例,如下所示:

std::vector< std::pair<EndPointAddr*, EndPointAddr*>* > mServiceSubscriptionsList;
Run Code Online (Sandbox Code Playgroud)

底层std :: pair对象中的第一项是订户实体的网络地址,而第二项是订阅实体的网络地址.因此,std :: pair对象在此表示订阅作为订阅者和订阅端点地址对.

我想删除此向量中针对给定订户端点地址的所有订阅.为此,我在下面写了指示函数,其中我使用带谓词的std :: remove_if.根据std :: remove_if的文档,我的理解是std :: remove_if将所有出现的内容都删除到向量的末尾,并将向量的末尾向后移动到新的位置.

我的问题是:

如何在调用remove_if之后到达向量末尾的这些std :: pair项目,以便逐个动态地解除分配它们的内容(即解除对std :: pair*指针的攻击)?你能在下面的功能代码中指出所需的代码片段吗?我可以删除最后保留在迭代器中的第一个出现.但是,我不知道如何删除其余的出现.谢谢.

bool 
XXX::removeSubscriptionForASpecificSubscriber(EndPointAddr * ptrSubscriberAddr)
{
  auto last = 
       std::remove_if(mServiceSubscriptionsList.begin(),
                      mServiceSubscriptionsList.end(),
                      [ptrSubscriberAddr](std::pair<EndPointAddr*, EndPointAddr*>*  thePair) 
                      { 
                         return ptrSubscriberAddr->getXXXAddress().compareTo(thePair->first->getXXXAddress());
                      });

 if(last != mServiceSubscriptionsList.end())
 {

   //HERE I CAN DELET THE FIRST OCCURENCE, but WHAT I WANT IS TO DELETE ALL OCCURANCES
   if(*last != nullptr)
   { 
     delete *last;
   }

   mServiceSubscriptionsList.erase(last, mServiceSubscriptionsList.end());

   return true;
 }

 return false;
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*lle 5

无法保证remove_if将已擦除的元素放在向量的末尾:范围内的迭代器是[newEnd, oldEnd)不可引用的,但元素具有未指定的值.

例如,以下代码

std::vector<int> v { 0, 1, 2, 3, 4 };
auto new_end = std::remove_if(v.begin(), v.end(), is_odd);
Run Code Online (Sandbox Code Playgroud)

可以修改v它包含的内容

0, 2, 4, 3, 4
         ^
       newEnd
Run Code Online (Sandbox Code Playgroud)

您可能应该使用std::partition或存储智能指针,以便您可以使用擦除 - 删除习惯用法(甚至根本不存储指针).