迭代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?
}
}
}
Run Code Online (Sandbox Code Playgroud)
也许这是xy问题,所以让我解释一下我需要的东西:我要做的是缩短一组vector<int>.MyPair每个元素都有相关的类型元素.这些相关元素存储在无序多图中.
typedef unordered_multimap < vector<int>, MyPair, SomeHash > MyMultiMap;
Run Code Online (Sandbox Code Playgroud)
set<vector <int> >如果已成功处理多图中的所有关联对,则可以删除元素.它对大多数人来说都不会成功,所以大多数人都应该留在这里.我的想法是从multimap中删除元素,如果multimap中没有关联元素,则意味着可以从集合中删除元素.这里我再次遇到问题,即在迭代时从集合中删除元素.同样,不仅是迭代器指向的那个.
从cppreference开始unordered_multimap::erase:
对已擦除元素的引用和迭代器无效。其他迭代器和引用不会失效。
所以我认为如果你得到一个迭代器secondPair然后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;
}
}
Run Code Online (Sandbox Code Playgroud)