繁体   English   中英

迭代时从STL容器中查找并擦除元素

[英]Find and erase element from STL container while iterating

虽然迭代一个multimap我想删除的元素,但不是唯一的元素的迭代器指向。

for (vector<int> myVec : myVectors)
{
    auto range = myMultiMap.equal_range(myVector);
    for (auto it = range.first; it != range.second; ++it)
    {
        // secondPair is another element of this multimap
        auto secondPair = getSecondPair(it, myMultiMap);
        if (condition)
        {
            it = myMultiMap.erase(it);
            auto finder = myMultiMap.find(secondPair);
            // how can I delete secondPair?
        }
    }
}

也许这是xy问题,所以让我解释一下我需要的东西:我要做的是缩短一组vector<int> 每个元素MyPair类型的关联元素。 这些相关元素存储在无序多图中。

typedef unordered_multimap < vector<int>, MyPair, SomeHash > MyMultiMap;

如果已成功处理多图中的所有关联对,则可以删除set<vector <int> >的元素。 它对大多数人来说都不会成功,所以大多数人都应该留在这里。 我的想法是从multimap中删除元素,如果multimap中没有关联元素,则意味着可以从集合中删除元素。 这里我再次遇到问题,即在迭代时从集合中删除元素。 同样,不仅是迭代器指向的那个。

unppdered_multimap unordered_multimap::erase上的cppreference

擦除元素的引用和迭代器无效。 其他迭代器和引用不会失效。

所以我认为如果你得到secondPairsecondPairIt != it的迭代器secondPairIt != it那么你可以安全地擦除secondPairIt 您还应该检查您是否没有使范围结束无效。

for (auto it = range.first; it != range.second;)
{
    if (condition)
    {
        auto secondPairIt = getSecondPairIt(it, myMultiMap); // Assume this is not end
        if (secondPairIt != it)
        {      
           if (secondPairIt == range.second)
               range.second = myMultiMap.erase(secondPairIt);
           else
               myMultiMap.erase(secondPairIt);
        }
        it = myMultiMap.erase(it);
    }
    else
    {
        ++it;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM