cb43a_c++_STL_算法_删除_(1)remove_remove_if
cb43a_c++_STL_算法_删除_(1)remove_remove_if
remove()
remove_if()
注意:
1.并不是真正的删除,而是把后面的元素向前移动,覆盖被删除元素,元素个数并没有减少
最后的一位或者两个的数据向前移动后,最后的数据没有其他数据覆盖,所以数据依然存在。
2.返回值是:新的逻辑终点,删除后,都采用逻辑终点。
error C2760: 语法错误: 意外的令牌“标识符”,预期的令牌为“;”
vs2017打开项目工程----> 属性 ---> c/c++ --> 语言 --> 符合模式 修改成否即可
//真正的删除用list的成员函数erase
1 /*cb43a_c++_STL_算法_删除_(1)remove_remove_if 2 remove() 3 remove_if() 4 5 注意: 6 1.并不是真正的删除,而是把后面的元素向前移动,覆盖被删除元素,元素个数并没有减少 7 最后的一位或者两个的数据向前移动后,最后的数据没有其他数据覆盖,所以数据依然存在。 8 2.返回值是:新的逻辑终点,删除后,都采用逻辑终点。 9 error C2760: 语法错误: 意外的令牌“标识符”,预期的令牌为“;” 10 vs2017打开项目工程----> 属性 ---> c/c++ --> 语言 --> 符合模式 修改成否即可 11 12 //真正的删除用list的成员函数erase 13 14 15 */ 16 #include <iostream> 17 #include <algorithm> 18 #include <list> 19 #include <vector> 20 #include <functional> 21 22 23 using namespace std; 24 template <typename TT> 25 void print(TT &il) 26 { 27 for (TT::iterator iter = il.begin(); iter != il.end(); ++iter) 28 29 cout << *iter << ' '; 30 cout << endl; 31 } 32 33 int main() 34 { 35 list<int> ilist; 36 for (int i = 1; i <= 6; ++i) 37 { 38 ilist.push_front(i); 39 ilist.push_back(i); 40 } 41 print(ilist); 42 43 list<int>::iterator end; 44 end=remove(ilist.begin(), ilist.end(), 3);//返回的是一个逻辑终点。不是ilist.end的位置 45 cout << "3删除后的情况:" << endl; 46 print(ilist); 47 48 cout << "返回一个逻辑终点的情况:" << endl; 49 50 for (list<int>::iterator iter = ilist.begin(); iter != end; ++iter) 51 { 52 cout << *iter << ' '; 53 54 } 55 cout << endl; 56 cout << "一共删除了:" << distance(end, ilist.end()) << " 个元素" << endl; 57 58 cout << "真正的删除,erase后的结果。" << endl; 59 ilist.erase(end, ilist.end()); 60 print(ilist); 61 62 vector<int> ivec; 63 for (int i = 2; i <= 6; ++i) 64 ivec.push_back(i); 65 for (int i = 4; i <= 9; ++i) 66 ivec.push_back(i); 67 for (int i = 1; i <= 7; ++i) 68 ivec.push_back(i); 69 cout << "vector里面的数据:" << endl; 70 print(ivec); 71 72 cout << "删除5,remove与erase结合" << endl; 73 ivec.erase(remove(ivec.begin(), ivec.end(), 5),ivec.end()); 74 print(ivec); 75 76 cout << "remove_if结合预定义的函数对象进行操作,删除小于5的数,实现真正的删除" << endl; 77 //remove_if返回一个迭代器的位置,然后,erase迭代器之间的数据。 78 ivec.erase(remove_if(ivec.begin(), ivec.end(), bind2nd(less<int>(), 5)), ivec.end()); 79 print(ivec); 80 return 0; 81 }
欢迎讨论,相互学习。
cdtxw@foxmail.com