簡體   English   中英

如何從QMap中刪除值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM