it编程 > 编程语言 > C/C++

C++中remove与erase区别小结

56人参与 2024-08-20 C/C++

vector中, remove函数和 erase函数都可以实现元素的删除,但它们的用法稍微有些区别:

erase

erase用于从一个集合中删除一个元素,但是对于基于数组的容器,如vector,存储在被删除元素后的所有元素都需要向前移动以避免集合中有一个空位(gap),在同一容器中多次调用产生了大量移动元素的开销。并且使用erase之后,后面元素的迭代器都会失效,例如:

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

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

	vector<int>::iterator itr = vec.begin();
	for(auto itr=vec.begin();itr!=vec.end();++itr) {
		if (*itr %2 == 1) {
			vec.erase(itr);   
		}
	}
	
	for(auto it=vec.begin();it!=vec.end();++it){
		cout<<*it<<"  ";
	}
	return 0;
}

在这里插入图片描述

这样的代码时无法编译成功的,因为在erase以后,之后所有的迭代器都失效了,此时会返回一个新的迭代器,我们可以对代码进行如下修改:

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

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

	vector<int>::iterator itr = vec.begin();
	while (itr != vec.end()) {
		if (*itr %2 == 1) {
			itr=vec.erase(itr);   
		}else{
			++itr; 
		}	               
	}
	
	for(auto it=vec.begin();it!=vec.end();++it){
		cout<<*it<<"  ";
	}
	return 0;
}

在这里插入图片描述

满足条件的就利用返回的新的迭代器,不满足条件的直接++;

remove

他们存在于algorithm库,由于这些算法运行在两个前向迭代器确定的元素范围上,它们没有底层容器或集合的具体知识。并不从容器删除元素,而是把不符合删除标准的元素搬移到容器的尾部,并保持这些元素的相对次序,返回指向最后一个元素下一个位置的迭代器。 该算法一次通过数据范围即可实现该目标。由于没有元素被删除,因此不会改变容器的大小和容量。容器尾部的元素都是需要被删除的,一般remove需要和erase搭配使用才能实现完整的删除功能。

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

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

    auto iter = std::remove(vec.begin(), vec.end(), 3);

    cout << "size is :" << vec.size() << endl;
    cout << "capacity is :" << vec.capacity() << endl;
    
    //输出迭代器之前的元素 
    for (auto first = vec.begin(); first < iter;++first) {
        cout << *first << " ";
    }
    cout<<endl;
    
    //输出vec剩余的元素 
    for (auto it = vec.begin(); it != vec.end();++it) {
        cout << *it << " ";
    }
    return 0;
}

在这里插入图片描述

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

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

    auto iter = std::remove(vec.begin(), vec.end(), 3);

    cout << "原 size is :" << vec.size() << endl;
    cout << "原 capacity is :" << vec.capacity() << endl;
    vec.erase(iter,vec.end()); 
    cout << "删除后 size is :" << vec.size() << endl;
    cout << "删除后 capacity is :" << vec.capacity() << endl;
    
    //输出迭代器之前的元素 
    for (auto first = vec.begin(); first < iter;++first) {
        cout << *first << " ";
    }
    cout<<endl;
    
    //输出vec剩余的元素 
    for (auto it = vec.begin(); it != vec.end();++it) {
        cout << *it << " ";
    }
    return 0;
}

在这里插入图片描述

也可以合并进行删除:

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

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

    vec.erase(remove(vec.begin(),vec.end(),3),vec.end());
    cout << "删除后 size is :" << vec.size() << endl;
    cout << "删除后 capacity is :" << vec.capacity() << endl;
    
    //输出vec剩余的元素 
    for (auto it = vec.begin(); it != vec.end();++it) {
        cout << *it << " ";
    }
    return 0;
}

在这里插入图片描述

补充删除 vector 容器元素的几种方式

在这里插入图片描述

到此这篇关于c++中remove与erase区别小结的文章就介绍到这了,更多相关c++ remove erase 内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

您想发表意见!!点此发布评论

推荐阅读

c++中new一个结构体初始化过程

08-20

C/C++中使用局部/全局变量初始值或默认值问题

08-21

C++中全局变量的初始化全过程

08-21

PyQt5 QFrame控件的用法详解

08-22

C++ 命名空间与输入输出操作代码

08-22

C++中的枚举enum类型使用示例详解

08-22

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论