亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在迭代時從地圖中刪除?

如何在迭代時從地圖中刪除?

C++
海綿寶寶撒 2019-07-30 11:24:56
如何在迭代時從地圖中刪除?如何在迭代時從地圖中刪除?喜歡:std::map<K, V> map;for(auto i : map)     if(needs_removing(i))         // remove it from the map如果我使用map.erase它將使迭代器無效
查看完整描述

3 回答

?
慕尼黑5688855

TA貢獻1848條經驗 獲得超2個贊

我個人更喜歡這種模式,它更加清晰和簡單,代價是額外的變量:

for (auto it = m.cbegin(), next_it = it; it != m.cend(); it = next_it){
  ++next_it;
  if (must_delete)
  {
    m.erase(it);
  }}

這種方法的優點:

  • for循環增量器作為增量器是有意義的;

  • 擦除操作是簡單的擦除,而不是與增量邏輯混合;

  • 在循環體的第一行之后,整個迭代中的含義itnext_it保持固定,允許您輕松添加引用它們的其他語句,而不必頭腦確定它們是否會按預期工作(當然除了it擦除后不能使用) 。


查看完整回答
反對 回復 2019-07-30
?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

簡而言之“如何在迭代時從地圖中刪除?”

  • 用舊地圖impl:你不能

  • 隨著新的地圖impl:幾乎像@KerrekSB建議的那樣。但他發布的內容存在一些語法問題。

來自GCC map impl(注意GXX_EXPERIMENTAL_CXX0X):

#ifdef __GXX_EXPERIMENTAL_CXX0X__      // _GLIBCXX_RESOLVE_LIB_DEFECTS
      // DR 130. Associative erase should return an iterator.
      /**
       *  @brief Erases an element from a %map.
       *  @param  position  An iterator pointing to the element to be erased.
       *  @return An iterator pointing to the element immediately following
       *          @a position prior to the element being erased. If no such 
       *          element exists, end() is returned.
       *
       *  This function erases an element, pointed to by the given
       *  iterator, from a %map.  Note that this function only erases
       *  the element, and that if the element is itself a pointer,
       *  the pointed-to memory is not touched in any way.  Managing
       *  the pointer is the user's responsibility.
       */
      iterator
      erase(iterator __position)
      { return _M_t.erase(__position); }#else
      /**
       *  @brief Erases an element from a %map.
       *  @param  position  An iterator pointing to the element to be erased.
       *
       *  This function erases an element, pointed to by the given
       *  iterator, from a %map.  Note that this function only erases
       *  the element, and that if the element is itself a pointer,
       *  the pointed-to memory is not touched in any way.  Managing
       *  the pointer is the user's responsibility.
       */
      void
      erase(iterator __position)
      { _M_t.erase(__position); }#endif

舊樣式和新樣式的示例:

#include <iostream>#include <map>#include <vector>#include <algorithm>using namespace std;typedef map<int, int> t_myMap;typedef vector<t_myMap::key_type>  t_myVec;int main() {

    cout << "main() ENTRY" << endl;

    t_myMap mi;
    mi.insert(t_myMap::value_type(1,1));
    mi.insert(t_myMap::value_type(2,1));
    mi.insert(t_myMap::value_type(3,1));
    mi.insert(t_myMap::value_type(4,1));
    mi.insert(t_myMap::value_type(5,1));
    mi.insert(t_myMap::value_type(6,1));

    cout << "Init" << endl;
    for(t_myMap::const_iterator i = mi.begin(); i != mi.end(); i++)
        cout << '\t' << i->first << '-' << i->second << endl;

    t_myVec markedForDeath;

    for (t_myMap::const_iterator it = mi.begin(); it != mi.end() ; it++)
        if (it->first > 2 && it->first < 5)
            markedForDeath.push_back(it->first);

    for(size_t i = 0; i < markedForDeath.size(); i++)
        // old erase, returns void...
        mi.erase(markedForDeath[i]);

    cout << "after old style erase of 3 & 4.." << endl;
    for(t_myMap::const_iterator i = mi.begin(); i != mi.end(); i++)
        cout << '\t' << i->first << '-' << i->second << endl;

    for (auto it = mi.begin(); it != mi.end(); ) {
        if (it->first == 5)
            // new erase() that returns iter..
            it = mi.erase(it);
        else
            ++it;
    }

    cout << "after new style erase of 5" << endl;
    // new cend/cbegin and lambda..
    for_each(mi.cbegin(), mi.cend(), [](t_myMap::const_reference it){cout << '\t' << it.first << '-' << it.second << endl;});

    return 0;}

打?。?/p>

main() ENTRYInit
        1-1
        2-1
        3-1
        4-1
        5-1
        6-1after old style erase of 3 & 4..
        1-1
        2-1
        5-1
        6-1after new style erase of 5
        1-1
        2-1
        6-1Process returned 0 (0x0)   execution time : 0.021 sPress any key to continue.


查看完整回答
反對 回復 2019-07-30
  • 3 回答
  • 0 關注
  • 377 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號