IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 关于C++11 stl中remove函数的讨论 -> 正文阅读

[C++知识库]关于C++11 stl中remove函数的讨论

关于C++11 stl中remove函数的讨论

直接上代码:

#include <algorithm>
#include <iterator>
#include <list>
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> vec = {1,2,3,3,4,5,6};
 
    
    // print all elements of the collection
    cout<<"pre:";
    for(auto it=vec.cbegin();it!=vec.cend();++it){
        cout<<*it<<" ";
    }
    cout<<endl;
    cout<<vec.size()<<endl;

    // remove all elements with value 3
    remove(vec.begin(),vec.end(),3);

    // print all elements of the collection
    cout<<"post:";
    for(auto it=vec.cbegin();it!=vec.cend();++it){
        cout<<*it<<" ";
    }
    cout<<endl;
    
    cout<<vec.size()<<endl;

    return 0;
}

输出结果:

pre: 1 2 4 5 6 5 6
7
post:1 2 4 5 6 5 6
7

由于对STL缺乏深层认识,我们一般认为调用remove()后,输出结果应该是:12456

但我们看到这样的话,vector大小变成7。然而调用remove后,前后并不改变vector的大小。

remove()并没有改变集合中的元素数量。cend()返回的是当初那个终点,size()返回的还是当初那个大小。元素次序改变了,有些元素被删除了,值为3的元素被其后的元素覆盖了。

接下来,思考为什么会出现这种情况呢?

先看一段代码:

#include <algorithm>
#include <iterator>
#include <iostream>
#include <vector>
using namespace std;

int main()
{
 	vector<int> vec = {1,2,3,3,4,5,6};
    vector<int>::iterator end = remove(vec.begin(),vec.end(),3);
    
    //输出vector元素
    for(auto it=vec.cbegin();it!=vec.cend();++it){
        cout<<*it<<" ";
    }
    cout<<endl;

    cout<<vec.size()<<endl;
    cout<<"--------"<<endl;

    
    for(auto it=vec.cbegin();it!=end;++it){
        cout<<*it<<" ";
    }
    cout<<endl;

    cout<<vec.size()<<endl;
    cout<<"--------"<<endl;
	
    //计算删除的元素个数,即两个迭代器位置的距离
    cout<<"number of removed elements: "
        <<distance(end,vec.end())<<endl;
   
    return 0;
}

输出结果:

1 2 4 5 6 5 6

7

1 2 4 5 6

7

number of removed elements: 2

看了这段代码,大概就明白了,原来remove()函数返回的是end,即这个end正是“被修改集合”经过元素移除动作后的新的逻辑终点,而cend迭代器还是当初那个终点。

remvove()会把原本置于后面的没有移除的元素向前移动,覆盖被移除的元素。而未被移除的元素在相对次序上保持不变。调用者在调用此算法后,逻辑起点还是原来的begin,而逻辑终点是返回的新逻辑终点,而不是原来的终点end。

另外一种情况:

如果remove删除的是vector最后一个元素呢,出现什么情况?

#include <algorithm>
#include <iterator>
#include <list>
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> vec = {1,2,3,3,4,5,6};

    
    // print all elements of the collection
    cout<<"pre:";
    for(auto it=vec.cbegin();it!=vec.cend();++it){
        cout<<*it<<" ";
    }
    cout<<endl;
    cout<<vec.size()<<endl;

    // remove all elements with value 3
    remove(vec.begin(),vec.end(),6);

    // print all elements of the collection
    cout<<"post:";
    for(auto it=vec.cbegin();it!=vec.cend();++it){
        cout<<*it<<" ";
    }
    cout<<endl;
    
    cout<<vec.size()<<endl;

    return 0;
}

输出结果:

pre:1 2 3 3 4 5 6
7
post:1 2 3 3 4 5 6
7

可以看到调用remove()的前后结果是一样的。

解释:remvove()会把原本置于后面的没有移除的元素向前移动,覆盖被移除的元素。由于删除6是最后一个元素,而6下一个元素没有值,就覆盖不了需要被删除的元素6,因此这个需要被删除的6并没有真正被删除掉,vector还保持原样。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 12:43:52  更:2022-03-06 12:46:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:37:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码