c++ Vector《二》 主要包括:《Vector的增删查找接口实现》《迭代器失效的问题》《常见的迭代器失效的场景》

一。Vector的增删查找

在这里插入图片描述

(1)push_back() / pop_back();
下来我们看一下的代码:

int main()
{
	int a[] = { 1, 2, 3, 4, 5 };
	vector<int> v(a, a + sizeof(a) / sizeof(int));

vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	v.pop_back();
	v.pop_back();
      it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

return 0;
}

下面我们就看一下程序执行的代码:
在这里插入图片描述
(2)find / insert / erase
我们看下面的一段代码,来理解其中的意思:

int main()
{
	int a[] = { 1, 2, 3, 4, 5 };
	vector<int> v(a, a + sizeof(a) / sizeof(int));
    vector<int>::iterator pos = find(v.begin(), v.end(), 3);
	 v.insert(pos ,30);

   vector<int>::iterator it = v.begin();
		while (it != v.end())
		{
			cout << *it << " ";
			it++;
		}
		cout << endl;

pos = find(v.begin(), v.end(), 3);

v.erase(pos);
		vector<int>::iterator ite = v.begin();
		while (ite != v.end())
		{
			cout << *ite << " ";
			++ite;
		}
return 0;
}

在这里插入图片描述
(3) operator[] 和 for+auto

// operator[]+index 和 C++11中vector的新式for+auto的遍历
// vector使用这两种遍历方式是比较便捷的。

我们看一下下面实现的代码:

int main()
{
	int a[] = { 1, 2, 3, 4, 5 };
	vector<int> v(a, a + sizeof(a) / sizeof(int));
	v[0] = 10;
	cout << v[0] << endl;
	
for (size_t i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;

vector<int> swapv;
	swapv.swap(v);

for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
	cout << "v data";

for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;

cout << "swapv data";
for (auto x : v)         //使用的是for+auto的方式
	{
		cout << x<<" ";
	}
	cout << "swapv data";
	cout << endl;

 return 0;
}

二。迭代器失效的问题

(1)insert / erase 导致迭代器失效;

我们先看下面一段代码:

int main()
{
	int a[] = { 1, 2, 3, 4, 5 };
	vector<int> v(a, a + sizeof(a) / sizeof(int));

vector<int>::iterator pos = find(v.begin(), v.end(), 3);
  //回答一
	    v.erase(pos);
		cout << *pos << endl;

//回答二
		pos = find(v.begin(), v.end(), 3);
		v.insert(pos,30);
        cout << *pos << endl;
			return 0;
}

我们看一下程序运行的结果:
在这里插入图片描述
由执行程序,我们可以看出,程序出现了崩溃,为什么崩溃,下来我们就分析一下:

回答一:删除pos位置的数据,导致pos迭代器失效;
回答二:insert会导致迭代器失效,是因为insert可能会导致增容,增容后pos还指向原来的空间,而原来的空间已经释放了。

两者是相互存在,相互制约的,所以我们在使用的时候,一定要先插入数据,然后在释放此处的数据;

(2)常见的迭代器失效的场景

现在我们实现一个删除2的倍数的值,来看一下代码的实现;

int main()
{
	int a[] = { 1, 2, 3, 4 };
	vector<int> v(a, a + sizeof(a) / sizeof(int));
vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		if (*it % 2 == 0)
		{
			v.erase(it);
			++it;
		}
		cout << endl;
	}
	return 0;
}

我们执行下面的一段程序,程序直接就崩溃了,那是因为如果是偶数,erase导致it失效。对失效的迭代器进行++it,会导致程序崩溃
那么如何改进呢?根据它失效的特性,我们由失效的特性来解决;
下来我们看下面修改后的代码:

int main()
{
	int a[] = { 1, 2, 3, 4 };
	vector<int> v(a, a + sizeof(a) / sizeof(int));
    vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		if (*it % 2 == 0)
			it = v.erase(it); //这里我不要在后面加加,等于偶数的时候,我们已近释放了那块空间,
		                       //改成这样, erase会返回删除位置的下一个位置
		else
			it++;
	}
	cout << endl;
	return 0;
}

看完了这篇博客相信大家对vector也有了一定的认识,下来之后,我们查看文档,多实现一下其他的接口,感觉可以的话,我们互相关注一下。

猜你喜欢

转载自blog.csdn.net/dpfxaca6/article/details/89117427