我有一个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)
无法保证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或存储智能指针,以便您可以使用擦除 - 删除习惯用法(甚至根本不存储指针).
| 归档时间: |
|
| 查看次数: |
1406 次 |
| 最近记录: |