我试图删除多图中具有相同键和值的元素。这是我现在的代码。删除元素后,我得到例外。
multimap<string, CStudent> m_StudentMap;
void removeDuplicates() {
for (auto it1 = m_StudentMap.begin(); it1 != --m_StudentMap.end(); it1++) {
for (auto it2 = next(it1, 1); it2 != m_StudentMap.end(); it2++) {
if (it1->first == it2->first) {
if (it1->second == it2->second) {
m_StudentMap.erase(it2);
}
}
}
}
}
答案 0 :(得分:0)
你几乎是对的,但是迭代时在地图中擦除元素的技巧是捕获erase
返回的新迭代器。我也推广了函数,因此它可以用于参数而不是仅限于m_StudentMap
,并且一旦键发散就停止内循环。
template <typename K, typename V>
void removeDuplicates(std::multimap<K, V>& mmap)
{
if (mmap.size() < 2) return;
for (auto it = mmap.begin(); it != prev(mmap.end()); ++it)
for (auto it2 = next(it); it2 != mmap.end() && it2->first == it->first; )
if (it->second == it2->second)
it2 = mmap.erase(it2);
else
++it2;
}
你可以看到它运行/分叉等等。here。