当前位置 博文首页 > L_add的博客:C++ 迭代器失效

    L_add的博客:C++ 迭代器失效

    作者:[db:作者] 时间:2021-08-15 22:13

    迭代器失效

    迭代器失效实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间
    迭代器失效有两种情况
    1、意义改变
    2、崩溃出现野指针
    引起失效的操作:
    1、指定位置元素的删除操作

    void test_vector4()
    {
    	vector<int> v;
    	v.push_back(1);
    	v.push_back(2);
    	v.push_back(3);
    	v.push_back(4);
    	v.push_back(5);
    	for (auto e : v)
    	{
    		cout << e << " ";
    	}
    	cout << endl;
    	//1 2 3 4 5
    	vector<int>::iterator pos = find(v.begin(), v.end(), 3);
    	if (pos != v.end())
    	{
    		v.insert(pos, 30);
    	}
    	for (auto e : v)
    	{
    		cout << e << " ";
    	}
    	cout << endl;
    	//1 2 30 3 4 5
    	//删掉3
    	v.erase(pos); //迭代器失效 
    	//迭代器失效情况:1、pos的意义改变 2、可能会崩溃出现野指针
    	//这里是意义改变
    	for (auto e : v)
    	{
    		cout << e << " ";
    	}
    	cout << endl;
    	//1 2 30 4 5
    }
    

    在这里插入图片描述
    在这里插入图片描述
    2、引起底层空间改变的操作
    eg:resize,reserve,insert,assign,push_back等

    void test_vector5()
    {
    	vector<int> v;
    	v.push_back(1);
    	v.push_back(2);
    	v.push_back(3);
    	v.push_back(4);
    	v.push_back(5);
    	v.push_back(6);
    	//要求删除vector中所有偶数
    	vector<int>::iterator it = v.begin();
    	while (it != v.end())
    	{
    		if (*it % 2 == 0) 
    		{//erase(it)以后it失效,不能++
    			it = v.erase(it);//erase返回删除位置it的下一个位置
    		}
    		else
    			it++;
    	}
    }
    
    cs
    下一篇:没有了