久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

remove_if 等效于 std::map

remove_if equivalent for std::map(remove_if 等效于 std::map)
本文介紹了remove_if 等效于 std::map的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我試圖根據特定條件從地圖中刪除一系列元素.我如何使用 STL 算法做到這一點?

I was trying to erase a range of elements from map based on particular condition. How do I do it using STL algorithms?

最初我想使用 remove_if 但這是不可能的,因為 remove_if 不適用于關聯容器.

Initially I thought of using remove_if but it is not possible as remove_if does not work for associative container.

是否有任何適用于地圖的remove_if"等效算法?

Is there any "remove_if" equivalent algorithm which works for map ?

作為一個簡單的選擇,我想到了遍歷地圖并擦除.但是循環遍歷地圖并擦除安全選項嗎?(因為擦除后迭代器無效)

As a simple option, I thought of looping through the map and erase. But is looping through the map and erasing a safe option?(as iterators get invalid after erase)

我使用了以下示例:

bool predicate(const std::pair<int,std::string>& x)
{
    return x.first > 2;
}

int main(void) 
{

    std::map<int, std::string> aMap;

    aMap[2] = "two";
    aMap[3] = "three";
    aMap[4] = "four";
    aMap[5] = "five";
    aMap[6] = "six";

//      does not work, an error
//  std::remove_if(aMap.begin(), aMap.end(), predicate);

    std::map<int, std::string>::iterator iter = aMap.begin();
    std::map<int, std::string>::iterator endIter = aMap.end();

    for(; iter != endIter; ++iter)
    {
            if(Some Condition)
            {
                            // is it safe ?
                aMap.erase(iter++);
            }
    }

    return 0;
}

推薦答案

差不多.

for(; iter != endIter; ) {
     if (Some Condition) {
          iter = aMap.erase(iter);
     } else {
          ++iter;
     }
}

如果您確實從中刪除了一個元素,那么您最初擁有的會增加迭代器兩次;您可能會跳過需要刪除的元素.

What you had originally would increment the iterator twice if you did erase an element from it; you could potentially skip over elements that needed to be erased.

這是我在很多地方看到使用和記錄的常用算法.

This is a common algorithm I've seen used and documented in many places.

您是正確的,迭代器在擦除后失效,但只有引用被擦除元素的迭代器,其他迭代器仍然有效.因此在 erase() 調用中使用 iter++.

You are correct that iterators are invalidated after an erase, but only iterators referencing the element that is erased, other iterators are still valid. Hence using iter++ in the erase() call.

這篇關于remove_if 等效于 std::map的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Assertion failed (size.widthgt;0 amp;amp; size.heightgt;0)(斷言失敗(size.width0 amp;amp; size.height0))
Rotate an image in C++ without using OpenCV functions(在 C++ 中旋轉圖像而不使用 OpenCV 函數)
OpenCV: process every frame(OpenCV:處理每一幀)
Why can#39;t I open avi video in openCV?(為什么我不能在 openCV 中打開 avi 視頻?)
OpenCV unable to set up SVM Parameters(OpenCV 無法設置 SVM 參數)
Convert a single color with cvtColor(使用 cvtColor 轉換單一顏色)
主站蜘蛛池模板: 欧美日韩亚洲在线 | 国产成人精品一区二区三区四区 | 福利视频亚洲 | 国产视频线观看永久免费 | 日韩国产在线 | jlzzxxxx18hd护士 | 久久久久亚洲视频 | 成人不卡 | 国产一二区在线 | 韩国av一区二区 | av香蕉 | 国产伦精品一区二区三区高清 | 欧洲尺码日本国产精品 | 久久久久久九九九九九九 | 精品国产乱码久久久久久丨区2区 | 天天玩天天操天天干 | 久久久入口 | 国产精品久久av | 久久一区二区三区免费 | 国产精品久久久久久久岛一牛影视 | 天天操夜夜操 | 欧美做暖暖视频 | 国产精品久久久久久一级毛片 | 欧美一级一区 | 欧美激情一区 | 一区二区中文 | 欧美日韩一区二区视频在线观看 | 成人综合久久 | 在线观看免费国产 | 欧美视频网 | 在线观看中文视频 | 国产激情亚洲 | 91精品久久久久久久久久 | 国产日本精品视频 | 欧美日本韩国一区二区三区 | 黄网站涩免费蜜桃网站 | www.av在线| 国产精品18hdxxxⅹ在线 | 国产精品美女久久久久久免费 | 亚洲视频免费在线观看 | 久久国产福利 |