当前位置 博文首页 > haimianjie2012的专栏:STL::vector删除指定值的元素

    haimianjie2012的专栏:STL::vector删除指定值的元素

    作者:[db:作者] 时间:2021-08-18 21:51

    1.删除说有满足条件的元素

    1.1 remove()

    remove由定义在 algorithm 头文件中的模板生成,所以要用它需要加上头文件#include?<algorithm>

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

    #include <iostream>
    #include <vector>
    #include  < algorithm >
    using namespace std;
    
    int main()
    {
    	vector<int> mv = { 1,2,3,5,4,6,7,5,9 };	
    	auto it = remove(mv.begin(), mv.end(), 5);	
    	auto it1 =mv.erase(it, mv.end());
    	
    }

    添加运行结果:

    #include <iostream>
    #include <vector>
    #include  < algorithm >
    using namespace std;
    
    int main()
    {
    	vector<int> mv = { 1,2,3,5,4,6,7,5,9 };
    	//vector<int> mv = { 1,2,3,5,4,6,7,5,9 };
    	cout << "my vector:" << endl;
    	for (auto tm = mv.begin(); tm != mv.end(); tm++)
    	{
    		cout << *tm << " ";
    	}
    	cout << endl;
    	auto it = remove(mv.begin(), mv.end(), 5);
    	cout << "after remove:" << endl;
    	if (it == mv.end())
    	{
    		for (auto tm = mv.begin(); tm != mv.end(); tm++)
    		{
    			cout << *tm << " ";
    		}
    		cout << endl;
    	}
    	else {
    		auto tm = mv.begin();
    		cout << "before iterator:" << endl;
    		for (; tm !=it; tm++)
    		{
    			cout << *tm << " ";
    		}
    		cout <<endl<< "after iterator:" << endl;
    		for (; tm != mv.end(); tm++)
    		{
    			cout << *tm << " ";
    		}
    		cout << endl;
    	}
    	
    	
    	auto it1 =mv.erase(it, mv.end());
    	cout << "after erase:" << endl;
    	if (it1 == mv.end())
    	{
    		for (auto tm = mv.begin(); tm != mv.end(); tm++)
    		{
    			cout << *tm << " ";
    		}
    		cout << endl;
    	}
    	else {
    		auto tm = mv.begin();
    		cout << "before iterator:" << endl;
    		for (; tm != it1; tm++)
    		{
    			cout << *tm << " ";
    		}
    		cout << "after iterator:" << endl;
    		for (; tm != mv.end(); tm++)
    		{
    			cout << *tm << " ";
    		}
    		cout << endl;
    	}
    }

    运行结果如下:

    ?

    ?

    1.2 vector erase()

    erase函数原型有两种形式:

    iterator erase(iterator position);
    iterator erase(iterator first, iterator last);

    返回指向下一个元素的迭代器。

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
    	vector<int> vec = { 1,2,3,5,4,6,7,5,9 };
    	cout << "befor del 5:" << endl;
    	for (auto tm = vec.begin(); tm != vec.end(); tm++)
    	{
    		cout << *tm << " ";
    	}
    	cout << endl;
    	for (auto it = vec.begin(); it != vec.end();)
    	{
    		if (5 == *it) {
    			it = vec.erase(it);
    		}
    		else {
    			++it;
    		}
    	}
    	cout << "after del 5:" << endl;
    	for (auto tm = vec.begin(); tm != vec.end(); tm++)
    	{
    		cout << *tm << " ";
    	}
    	cout << endl;
    }

    ?运行结果:

    ?注意:

    erase删除一个元素时,当前迭代器已经失效,需要让iterator迭代器指向下一个元素的迭代器,否则就会报错,自己可以试试,这里绝对是一个坑;

    it = vec.erase(it);

    2.只删除一个元素

    2.1 find()函数

    函数的语法格式:

    InputIterator find (InputIterator first, InputIterator last, const T& val);

    其中,first 和 last 为输入迭代器,[first, last) 用于指定该函数的查找范围;val 为要查找的目标元素。

    该函数适用于所有的序列式容器?

    当 find() 函数查找成功时,其指向的是在 [first, last) 区域内查找到的第一个目标元素;如果查找失败,则该迭代器的指向和 last 相同。

    头文件:

    #include <algorithm>    // std::find

    注意string类也有一个find函数,与stl的find算法有些不同,大家可以读读:C++ string中的find()函数 - 王陸 - 博客园 (cnblogs.com)?

    #include <iostream>
    #include <vector>
    #include  < algorithm >
    using namespace std;
    //删除说有满足条件的元素
    void Del_1();
    int main()
    {
    	vector<int> mv = { 1,2,3,5,4,6,7,5,9 };	
    	
    	auto it = find(mv.begin(), mv.end(), 5);	
    
    	if (it != mv.end())
    	{
    		mv.erase(it);		
    	}
    
    }

    添加打印信息:?

    #include <iostream>
    #include <vector>
    #include  < algorithm >
    using namespace std;
    //删除说有满足条件的元素
    void Del_1();
    int main()
    {
    	vector<int> mv = { 1,2,3,5,4,6,7,5,9 };
    	//vector<int> mv = { 1,2,3,5,4,6,7,5,9 };
    	cout << "my vector:" << endl;
    	for (auto tm = mv.begin(); tm != mv.end(); tm++)
    	{
    		cout << *tm << " ";
    	}
    	cout << endl;
    	auto it = find(mv.begin(), mv.end(), 5);
    	cout << "after find:" << endl;
    	if (it == mv.end())
    	{
    		for (auto tm = mv.begin(); tm != mv.end(); tm++)
    		{
    			cout << *tm << " ";
    		}
    		cout << endl;
    	}
    	else {
    		auto tm = mv.begin();
    		cout << "before iterator:" << endl;
    		for (; tm != it; tm++)
    		{
    			cout << *tm << " ";
    		}
    		cout << endl << "after iterator:" << endl;
    		for (; tm != mv.end(); tm++)
    		{
    			cout << *tm << " ";
    		}
    		cout << endl;
    	}
    
    	if (it != mv.end())
    	{
    		auto it1=mv.erase(it);
    		cout << "after erase:" << endl;
    		if (it1 == mv.end())
    		{
    			for (auto tm = mv.begin(); tm != mv.end(); tm++)
    			{
    				cout << *tm << " ";
    			}
    			cout << endl;
    		}
    		else {
    			auto tm = mv.begin();
    			cout << "before iterator:" << endl;
    			for (; tm != it1; tm++)
    			{
    				cout << *tm << " ";
    			}
    			cout << endl << "after iterator:" << endl;
    			for (; tm != mv.end(); tm++)
    			{
    				cout << *tm << " ";
    			}
    			cout << endl;
    		}
    	}
    
    }

    运行结果:?

    ?

    参考文献:

    C++ find()函数用法详解(超级详细) (biancheng.net)

    在vector中,怎样删除某个指定值的元素

    cs