次の行で定義されている std::vector インスタンスがあります。
std::vector< std::pair<EndPointAddr*, EndPointAddr*>* > mServiceSubscriptionsList;
基礎となる std::pair オブジェクトの最初の項目はサブスクライバー エンティティのネットワーク アドレスであり、2 番目の項目はサブスクライブされたエンティティのネットワーク アドレスです。したがって、std::pair オブジェクトは、ここではサブスクリプションを、サブスクライバーとサブスクライブされたエンドポイント アドレスのペアとして表します。
特定のサブスクライバー エンドポイント アドレスについて、このベクター内のすべてのサブスクリプションを削除したいと考えています。この目的のために、述語で std::remove_if を使用する指定された関数を以下に記述しました。std::remove_if のドキュメントに基づいて、私の理解では、 std::remove_if は削除されるすべての出現をベクトルの最後に置き、ベクトルの最後を新しい位置に後方に移動します。
私の質問は次のとおりです。
これらの std::pair アイテムは、remove_if の呼び出し後にベクターの最後に配置され、コンテンツを 1 つずつ動的に割り当て解除します (つまり、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;
}