栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > C/C++/C#

c++ STL:关于 std::vector 的移除删除函数remove()和erase()的使用

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++ STL:关于 std::vector 的移除删除函数remove()和erase()的使用

一、结论

std::vector 中remove()只是将待删除元素之后的元素移动到vector的前端,而不是真正删除。若要真正移除,需要搭配使用erase()。

二、论证代码
#include 
#include 
using namespace std;

int main()
{
	const int VECTOR_SIZE = 8;

	// Define a template class vector of integers
	vector Numbers(VECTOR_SIZE);

	//Initialize vector Numbers
	Numbers[0] = 10;
	Numbers[1] = 20;
	Numbers[2] = 10;
	Numbers[3] = 15;
	Numbers[4] = 12;
	Numbers[5] = 7;
	Numbers[6] = 9;
	Numbers[7] = 10;

	cout << "The Numbers:" << endl;

	for (auto itor : Numbers)
	{
		cout << itor << "  " ;
	}

	cout << endl;
	cout << "After remove() The Numbers:" << endl;
	auto itorLast = remove(Numbers.begin(), Numbers.end(), 10);
	for (auto itor : Numbers)
	{
		cout << itor << "  ";
	}

	cout << endl;
	cout << "After remove() The removed Number count:" << Numbers.end() - itorLast << endl;
	cout << "After remove() The wanted Numbers:" << endl;
	for (auto itor = Numbers.begin(); itor != itorLast; itor++)
	{
		cout << *itor << "  ";
	}
	
	return 0;
}

三、真正实现删除
#include 
using namespace std;
#include 
int main()
{
	const int VECTOR_SIZE = 8;

	// Define a template class vector of integers
	vector Numbers(VECTOR_SIZE);

	//Initialize vector Numbers
	Numbers[0] = 10;
	Numbers[1] = 20;
	Numbers[2] = 10;
	Numbers[3] = 15;
	Numbers[4] = 12;
	Numbers[5] = 7;
	Numbers[6] = 9;
	Numbers[7] = 10;

	cout << "The Numbers:" << endl;

	for (auto itor : Numbers)
	{
		cout << itor << "  " ;
	}
	cout << endl;

	Numbers.erase(remove(Numbers.begin(), Numbers.end(), 10), Numbers.end());
	for (auto itor : Numbers)
	{
		cout << itor << "  ";
	}

	return 0;
}

四、关于erase()使用误区

错误用法:earase()结束后,iter变成了野指针,iter++就产生了错误。

for(vector::iterator iter=veci.begin(); iter!=veci.end(); iter++)
{
      if( *iter == 3)
      {
      	  veci.erase(iter);
      }    
}

另一种错误:无法删除连续两个3.

for(vector::iterator iter=veci.begin(); iter!=veci.end(); iter++)
{
      if( *iter == 3)
             iter = veci.erase(iter);
}

正确用法:

for(vector::iterator iter=veci.begin(); iter!=veci.end(); )
{
     if( *iter == 3)
          iter = veci.erase(iter);
      else
            iter ++ ;
}
五、对于有序数组去重
// 先排序
sort(Numbers.begin(), Numbers.end());
// 去除重复
Numbers.erase(unique(Numbers.begin(), Numbers.end()), Numbers.end());
转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1037897.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号