C++中erase()函数的使用,可以用来进行内存擦除

erase函数的原型如下:

(1)string& erase( size_t pos = 0m size_t n = npos);

(2)interator erase( iterator position);

(3)iterator erase( iterator first, iterator last);

有三种用法:

(1)erase( pos, n); 删除从pos开始的n个字符,例如erase( 0, 1),删除0位置的一个字符,即删除第一个字符

(2)erase( position); 删除position处的一个字符(position是个string类型的迭代器)

(3)erase(first,last);删除从first到last之间的字符,(first和last都是迭代器)

#include <iostream>
#include <string>
using namespace std;

int main ()
{
  string str ("This is an example phrase.");
  string::iterator it;

  // 第(1)种用法
  str.erase (10,8);
  cout << str << endl;        // "This is an phrase."

  // 第(2)种用法
  it=str.begin()+9;
  str.erase (it);
  cout << str << endl;        // "This is a phrase."

  // 第(3)种用法
  str.erase (str.begin()+5, str.end()-7);
  cout << str << endl;        // "This phrase."
  return 0;
}
 
 

erase()函数的功能是用来删除容器中的元素

删除某个容器里的某个元素:c.erase(T);

看似一个简单的动作,然而对不同类型的容器,内部却做了截然不同的事情,后面介绍。
假设有这样一个题目,将某个容器中所有满足条件N == X的元素删除,按照常规的思路应该有类似这样的代码:
// 假设Container和container分别表示一种容器和对应的一个对象

Container<T>::iterator it;

for (it = container.begin(); it != container.end(); ++it) {

  if (N == X)

    container.erase(it);

}
然而这样的代码对于任一种容器都是错误的
容器按内存分配方式可以分为链表容器和数组容器。
所谓的链
表容器指的是一种表现方式,包括list、slist等这样基于节点的容器(动态分配内存块)和set、map、multiset、multimap等关
联容器(平衡树实现),而数组容器指的是在一块连续的内存上保存元素的连续内存容器,比如vector、deque、string等。
链表容器
以list为例,当执行container.erase(it)时,确实第一个满足条件的元素删除了,但这时it指针已经被删除了,它也不指向任何元素
了,所以也只能到此为止了,也就是说上面的代码对于链表容器来说只能正确删除第一个满足条件的元素,针对这个问题我们首先想到的就是在删除指针之前,给其
做个备份。
将这个临时变量直接建立在erase实现里,这样做更简洁,也显得专业些。
list<int>::iterator it; 

  for (it = lt.begin(); it != lt.end(); ) {

    if (*it % 2 == 0)

      lt.erase(it++); //这里是关键

    else

      ++it;

  }

 
链表容器使用erase删除节点还有一个特点,就是会将下一个元素的地址返回,所以也可以这样实现:
list<int>::iterator it; 

  for (it = lt.begin(); it != lt.end(); ) {

    if (*it % 2 == 0)

      it = lt.erase(it);//自动返回下一个元素的地址,不用再主动前移指针

    else

      ++it;

  }

 

vector<int>::iterator it = v.begin();

  for (it = v.begin(); it != v.end(); ) { 

    if (*it % 2 == 0)

      v.erase(it);//删除元素后,后面元素自动往前移,不用挪动指                  

    else

      ++it;

  }

 网上有说在VS2005里面上面的v.erase(it)写法是行的  VS2008及2010却运行会出现错误 会出现

vector erase iterator outside range  最保险的做法是将v.erase(it)改成 it=v.erase(it)

  • 20
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++,`std::unique()`函数是用于在序列移除连续的重复元素的算法函数。它的作用是将重复的元素移到序列的末尾,并返回指向不重复序列的尾后迭代器。 `std::unique()`函数的声明如下: ```cpp template<class ForwardIt> ForwardIt unique(ForwardIt first, ForwardIt last); ``` 其,`first`和`last`是表示序列范围的迭代器。函数会对从`first`到`last`范围内的元素进行去重操作。 `std::unique()`函数使用方法如下: ```cpp #include <iostream> #include <algorithm> #include <vector> int main() { std::vector<int> numbers = {1, 1, 2, 2, 3, 4, 4, 5, 5}; // 使用 std::unique() 去除连续重复元素 auto last = std::unique(numbers.begin(), numbers.end()); // 输出不重复序列 for (auto it = numbers.begin(); it != last; ++it) { std::cout << *it << " "; } return 0; } ``` 以上代码会输出:`1 2 3 4 5`。 `std::unique()`函数会将连续重复的元素放置在容器的末尾,并返回指向不重复序列的尾后迭代器。你可以使用返回的迭代器来确定不重复序列的范围。使用`std::unique()`函数时,注意要确保序列已经按照需要进行排序,因为它只会移除相邻的重复元素。 需要注意的是,`std::unique()`函数只能去除连续重复的元素,对于非连续重复的元素无法处理。如果需要移除所有重复元素,可以先对序列进行排序,然后使用`std::unique()`函数去除连续重复元素,最后使用`std::erase()`函数擦除多余的元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值