我是靠谱客的博主 甜美长颈鹿,最近开发中收集的这篇文章主要介绍彻底掌握erase函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

今天又遇到erase问题,以前存在着一些疑惑,今天决定将其彻底弄清楚,首先看看函数的声明:
#include <list>
iterator erase( iterator loc );
iterator erase( iterator start, iterator end );

The erase() function either deletes the element at location loc, or deletes the elements between start and end (including start but not including end). The return value is the element after the last element erased.
这上面的最后一句话,我觉得不好理解,既然这样就只有看源代码了。

The first version of erase (the version that deletes a single element at location loc) runs in constant time for lists and linear time for vectors, dequeues, and strings. The multiple-element version of erase always

takes linear time.

源码如下:
  iterator erase(iterator __position)
 {
    if (__position + 1 != end())
      copy(__position + 1, _M_finish, __position); //首先这里把后面的元素向前移动一个单位,覆盖要删
除的元素.
    --_M_finish;
    destroy(_M_finish); //释放最后一个元素占据的存储空间
    return __position; //这里返回的位置已经是删除元素的下一个的位置
  }
  iterator erase(iterator __first, iterator __last)
  {
    iterator __i = copy(__last, _M_finish, __first);
    destroy(__i, _M_finish);
    _M_finish = _M_finish - (__last - __first);
    return __first;
  }

我想大家如果看了源代码,就很好理解erase的工作原理了,最后附上一道简单测试题目,源于C++primer(The third Edition),我给出一个简单的解决方案。

/*
请写一个程序使它接受下列定义
int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 };
list<int> ilist( ia, ia+11 );
用单个iterator 形式的erase()删除ilist 中所有奇数位置的元素
*/
#include<iostream>
#include<list>
using namespace std;

int main()
{
    int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 };
    int ia_size = sizeof(ia) / sizeof(int);
    list<int> ilist(&ia[0],&ia[ia_size]);
   
    list<int>::iterator ite;
    for(ite = ilist.begin();ite != ilist.end();++ite)
    {
        cout<<*ite<<"   ";
    }
    cout<<endl;
   
    // do earse operation
    list<int>::iterator tmpite;
    int iIndex = 1; //记录元素的位置
    for(ite = ilist.begin();ite != ilist.end();++ite)
    {
       if(iIndex % 2 == 1)
       {
               ite = ilist.erase(ite); //这里ite已经失效,所以需要保存返回值
               --ite;   //这里--操作,以抵消++操作,这样才能不遗漏元素而遍历完所有的元素了.
       }
       ++iIndex;
    }
    for(ite = ilist.begin();ite != ilist.end();++ite)
    {
        cout<<*ite<<"   ";
    }
    cout<<endl;
    system("pause");
    return 0;
}
 

最后

以上就是甜美长颈鹿为你收集整理的彻底掌握erase函数的全部内容,希望文章能够帮你解决彻底掌握erase函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部