C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++ remove erase

C++中remove与erase区别小结

作者:吃我一个平底锅

remove函数和 erase函数都可以实现元素的删除,本文主要介绍了C++中remove与erase区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:
阅读全文