STL remove和remove_if

1)对于vector容器:

remove和remove_if的区别就是第3个参数的区别,remove第3个参数为常数,remove_if第3个参数为过滤条件,调用时传一个函数指针,remove和remove_if 后,容器的size不会改变,只是想元素往前移动,在remove和remove_if后,需要用erase删除元素;例子如下:

#include <vector>
#include <algorithm>

using namespace std;

 


bool isOdd(int value) 

 return (value % 2) == 1; 

int _tmain(int argc, _TCHAR* argv[])
{

 std::vector<int>  my_container; 

 for (int i = 0; i < 10; ++i)
 { 
  my_container.push_back(i); 
 } 
 

 

 remove_if(my_container.begin(), my_container.end(), isOdd);

 for (vector<int>::iterator iter=my_container.begin();iter!=my_container.end();iter++)
 {
  //
  printf("remove_if=%d\n",*iter);

 }

 my_container.erase( remove_if(my_container.begin(), my_container.end(), isOdd), my_container.end());

 //
 for (vector<int>::iterator iter=my_container.begin();iter!=my_container.end();iter++)
 {
  //
  printf("erase=%d\n",*iter);

 }

 

 return 0;
}

 

打印结果如下:

 

2)对于List容器

List容器本身提供remove函数和remove_if函数,remove只有一个参数,传值,remove_if也只有一个参数,为过滤条件,传函数指针;注意:list容器的remove和remove_if操作后,容器的size是会发生变化的,同样如果使用泛型算法里面的remove和remove_if,容器的size也会发生变化;这个是和vector不同的:举例如下:

int _tmain(int argc, _TCHAR* argv[])
{

 //std::vector<int>  my_container; 
 std::list<int>my_container;

 for (int i = 0; i < 10; ++i)
 { 
  my_container.push_back(i); 
 } 
 

 //remove(my_container.begin(), my_container.end(), 3);
 my_container.remove_if(isOdd);

 for (list<int>::iterator iter=my_container.begin();iter!=my_container.end();iter++)
 {
  //
  printf("remove_if=%d\n",*iter);

 }

 


 return 0;
}

 

输出结果:

这个和vector的list的有关,vector为数组,删除元素,所有的元素前移,list删除元素后,就会将当前节点删掉;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这三个函数是 STL 算法中用于删除元素的函数。它们的作用分别是: - `remove_if`:删除满足指定条件的元素,返回指向新的逻辑结尾的迭代器。 - `remove_copy`:将满足指定条件的元素拷贝到另一个容器中,返回指向新的逻辑结尾的迭代器。 - `remove_copy_if`:将不满足指定条件的元素拷贝到另一个容器中,返回指向新的逻辑结尾的迭代器。 下面是它们的用法和示例: ```cpp #include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { // remove_if vector<int> v1{1, 2, 3, 4, 5}; auto it1 = remove_if(v1.begin(), v1.end(), [](int x) { return x % 2 == 0; }); v1.erase(it1, v1.end()); for (int x : v1) { cout << x << " "; // 输出 1 3 5 } cout << endl; // remove_copy vector<int> v2{1, 2, 3, 4, 5}; vector<int> v3; remove_copy(v2.begin(), v2.end(), back_inserter(v3), [](int x) { return x % 2 == 0; }); for (int x : v3) { cout << x << " "; // 输出 1 3 5 } cout << endl; // remove_copy_if vector<int> v4{1, 2, 3, 4, 5}; vector<int> v5; remove_copy_if(v4.begin(), v4.end(), back_inserter(v5), [](int x) { return x % 2 == 0; }); for (int x : v5) { cout << x << " "; // 输出 1 3 5 } cout << endl; return 0; } ``` 注意,这三个函数并不真正删除容器中的元素,而是返回指向新的逻辑结尾的迭代器。如果要真正删除元素,需要结合容器的 `erase` 函数使用。此外,`remove_copy` 和 `remove_copy_if` 会将满足条件的元素拷贝到另一个容器中,因此要注意目标容器的类型和大小。在示例中,使用了 `back_inserter` 函数将元素插入 `vector` 的尾部。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值