乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      容器list使用之erase

       勤奮不止 2014-04-23
              今天無論如何要寫點(diǎn)東西,算是搞清楚了一點(diǎn)東西吧。有點(diǎn)小小的成就感。
             之前在程序里面使用了list容器,其中用到了erase()函數(shù),之前一直沒出現(xiàn)問題,這兩天突然莫名奇妙。花了點(diǎn)時間,搞清楚了erase()函數(shù)的機(jī)理。
             常用的刪除容器中元素的方法是如下(方法1):
            list< int> List;
            list< int>::iterator iter;
            for( iter = List.begin(); iter != List.end(); )
            {
                  if(1)  
                  {
                     iter = List.erase( iter );
                  }
                  else
                  {
                     iter++;
                  }
            }

            也可以這樣寫(方法2):
            list< int> List;
            list< int>::iterator iter;
            for( iter = List.begin(); iter != List.end(); )
            {
                  if(1)  
                  {
                     List.erase( iter++ );
                  }
                  else
                  {
                     iter++;
                  }
            }

           有一種錯誤的寫法(注意同方法2比較)
           list< int> List;
            list< int>::iterator iter;
            for( iter = List.begin(); iter != List.end(); )
            {
                  if(1)  
                  {
                     List.erase( iter );
                  }

                  iter++;
            }

           我們看一下erase()函數(shù)的源代碼(僅列出release下的代碼)。
              iterator erase(iterator _Where)
                // erase element at _Where
              _Nodeptr _Pnode = (_Where++)._Mynode();

              if (_Pnode != _Myhead)
                    // not list head, safe to erase
                  _Nextnode(_Prevnode(_Pnode)) = _Nextnode(_Pnode);
                  _Prevnode(_Nextnode(_Pnode)) = _Prevnode(_Pnode);
                  this->_Alnod.destroy(_Pnode);
                  this->_Alnod.deallocate(_Pnode, 1);
                  --_Mysize;
                  }
              return (_Where);
              }

      函數(shù)在返回的時候,是返回當(dāng)前迭代器的下一個節(jié)點(diǎn)。所以當(dāng) iter = List.erase( iter ); 執(zhí)行以后,迭代器自動指向了下一個元素。而對于入?yún)⒅械膇ter,所指的地址已經(jīng)被銷毀,所以寫的時候,應(yīng)該注意加上前面的iter =
      那另外的一種寫法,List.erase( iter++ ); 為什么也是對的呢?
      這里研究了一下,這里需要講一下++運(yùn)算符的操作。(慚愧啊,++使用了這么多年,居然現(xiàn)在才搞明白)
              _Myt_iter& operator++()   
                    // preincrement
                  ++(*(_Mybase_iter *)this);
                  return (*this);
                  }

              _Myt_iter operator++(int) 
                    // postincrement
                  _Myt_iter _Tmp = *this;
                  ++*this;
                  return (_Tmp);
                  }

      ++實(shí)際上可以看做是一個函數(shù)。
      對于++在后的情況(例如i++),函數(shù)在運(yùn)行的時候,將運(yùn)算的數(shù)據(jù)i已經(jīng)改變,但是函數(shù)的返回值是操作之前的數(shù)據(jù),所以在我們看來,i++好像是先進(jìn)行了i的讀取,才+1。

      回到迭代器,List.erase( iter++ );就沒有問題了。

      對于那種錯誤的方法,List.erase( iter );在執(zhí)行以后,iter所指的對象已經(jīng)被銷毀,所以再對iter進(jìn)行操作是非法的,程序會出錯。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多