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