[英]How to remove values from a QMap?
假設我想根據一些標准刪除項目。 讓我們說:
QMap<int, int> map;
我想刪除所有值為奇數的項目。 如果我使用迭代器:
for (auto it = map.begin(); it != map.end(); ++it)
if (it.value() % 2 == 1)
map.remove(it.key());
這個代碼可能是錯的,因為調用了
map.remove(it.key())
使迭代器無效。 如何在每次刪除后不重置迭代器的情況下執行此操作?
使用QMap::erase
代替,它返回一個迭代器到你剛刪除的元素之后的元素:
for (auto it = map.begin(); it != map.end();)
if (it.value() % 2 == 1)
it = map.erase(it);
else
++it;
另一種方法是在迭代器上使用postfix increment運算符:
for (auto it = map.begin(); it != map.end();)
if (it.value() % 2 == 1)
map.erase(it++);
else
++it;
另一種方式(可能效率較低)是使用STL remove_copy_if
算法,然后是swap
:
bool valueIsOdd(int value) {return value % 2 == 1;}
QMap<int,int> b;
std::remove_copy_if(a.begin(), a.end(),
std::inserter(b, b.end()),
&valueIsOdd);
a.swap(b);
我現在無法測試最后一個例子。
你最好使用更像STL的erase
功能:
使用此方法,您可以正確實現循環:
for (auto it = map.begin(); it != map.end(); /* don't increment here */) {
if (it.value() % 2 == 1) {
it = map.erase(it);
} else {
++it;
}
}
我認為你可以從map.remove((it++).key())
得到相同的結果,但這比erase
更慢更亂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.