STL中remove和remove_if用法


 

remove 和 remove_if方法都是包含在<algorithm>頭文件當中的,先來看看原型:

 1 // TEMPLATE FUNCTION remove
 2 template<class _FI, class _Ty> inline
 3     _FI remove(_FI _F, _FI _L, const _Ty& _V)
 4     {_F = find(_F, _L, _V);
 5     if (_F == _L)
 6         return (_F);
 7     else
 8         {_FI _Fb = _F;
 9         return (remove_copy(++_F, _L, _Fb, _V)); }}
10         // TEMPLATE FUNCTION remove_if
11 template<class _FI, class _Pr> inline
12     _FI remove_if(_FI _F, _FI _L, _Pr _P)
13     {_F = find_if(_F, _L, _P);
14     if (_F == _L)
15         return (_F);
16     else
17         {_FI _Fb = _F;
18         return (remove_copy_if(++_F, _L, _Fb, _P)); }}

這兩個方法的前兩個參數均相同,第三個參數不同。
remove的第三個參數是常量

如:

去除vector中為3的元素:

 1 int main(int argc, char* argv[])
 2 {
 3     std::vector<int> vec;
 4     vec.push_back(2);
 5     vec.push_back(3);
 6     vec.push_back(4);
 7     vec.push_back(6);
 8     vec.push_back(8);
 9     vec.push_back(12);
10     vec.push_back(22);
11     vec.push_back(33);
12                 
13                 //從前往后找出3的元素,並從vector中erase
14                 //remove第三個參數為常數的情況
15     vec.erase( std::remove(vec.begin(),vec.end(),3), vec.end() );
16 
17     std::vector<int>::iterator iter = vec.begin();
18     for (iter = vec.begin(); iter != vec.end(); iter++)
19     {
20         printf("%d\n",(*iter));
21     }
22 
23     return 0;
24 }

該方法std::remove(vec.begin(),vec.end(),3); 不會改變容器大小,並返回容器末端的最后一個元素.

所以單看這條語句,如打印整個容器,得到的將是:

2 4 6 8 12 22 33 33

刪除的元素后面的全部往前移,並最后一個位置返回之前的最后一個元素。故最后的元素多打印了一次。

該方法結合erase方法:vec.erase( std::remove(vec.begin(),vec.end(),3), vec.end() ); 就是將返回的多出來的最后一個元素從容器中erase掉。

從而得到最后正確的結果:

2 4 6 8 12 22 33

*********************************************

remove_if方法的第三個參數是一個過濾條件,即我們要使用何種清除規則來清楚容器中的元素

如,我們要刪除容器中所有為3的倍數的元素:

 

 1 //該方法實現對3的倍數的元素的過濾
 2 //參數是容器中的元素,注意返回值類型
 3 bool RemoveItem(int item)
 4 {
 5     if (item%3 == 0)
 6     {
 7         return true;
 8     }
 9     else
10     {
11         return false;
12     }
13 }
14 
15 int main(int argc, char* argv[])
16 {
17     std::vector<int> vec;
18     vec.push_back(2);
19     vec.push_back(3);
20     vec.push_back(4);
21     vec.push_back(6);
22     vec.push_back(8);
23     vec.push_back(12);
24     vec.push_back(33);
25     vec.push_back(22);
26 //第三個參數是使用函數指針的方法調用,參數由系統自動傳遞
27 //返回值為真則清除,假則不清除
28    vec.erase( std::remove_if(vec.begin(),vec.end(),RemoveItem), vec.end() );
29 
30     std::vector<int>::iterator iter;
31     for (iter = vec.begin(); iter != vec.end(); iter++)
32     {
33         printf("%d\n",(*iter));
34     }
35 
36     return 0;
37 }

打印結果為:

2 4 8 22


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM