STL标准模版库--vector的操作集合

  1. vector常规用法

  2. vector迭代器失效

通常会出现迭代器失效的情况:

(1)insert时(可能会增容),增容后会出现野指针,从而引发迭代器失效;

(2)erase时(vs报错,但linux并不一定报错),如果删的是最后一个位置,就会会出现越界的情况,也就是空间不够,从而引发迭代器失效;

1. vector常规用法

#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;
//vector是将元素置于一个动态数组中加以管理的容器,支持下标索引[],at()方法
//元素是按照值拷贝的方式进行的,所以要提供拷贝构造函数
 
void printVector(vector<int>vectorPrint){
    
    
	for (int c : vectorPrint){
    
    
		cout << c << " ";
	}
	cout << endl;
}
int main()
{
    
    
	//1.带参数的构造函数
	cout << "1.带参数的构造函数" << endl;
	int a[] = {
    
     0, 1, 2, 3, 4 };
	int b[] = {
    
     5, 6, 7, 8, 9 ,10 };
	vector<int>vectorA(a, a + 5);//可以将相对应的内存地址连续的赋值给容器,区间是左闭右开的原则
	vector<int>vectorB(vectorA.begin(), vectorA.end());//本质上还是两个地址区间的内容进行赋值
	vector<int>vectorC(3, 9);//构造函数将3个9进行拷贝赋值
	vector<int>vectorD(vectorA);//两个类型相同的容器进行拷贝赋值
	printVector(vectorA);
	printVector(vectorB);
	printVector(vectorC);
	printVector(vectorD);
	//2.赋值操作
	cout << "2.赋值操作" << endl;
	vectorA.assign(a, a + 5);//重新分配,不使用拷贝构造函数
	printVector(vectorA);
	vectorB.assign(vectorA.begin(), vectorA.end());
	printVector(vectorB);
	vectorD = vectorB;
	printVector(vectorD);
	vectorB.assign(b, b + 5);//重新分配赋值
	printVector(vectorB);
	vectorD.swap(vectorB);// 同类型容器值交换,只覆盖vectorD.size()个位置
	printVector(vectorD);
 
	//3.容器大小操作
	cout << "3.容器大小操作" << endl;
	cout<< vectorD.size()<< endl;//求容器的大小
	bool dempty = vectorD.empty();//判断容器是否为空,是空的话为1
	cout << "dempty = " << dempty << endl;
	vectorD.resize(6);//重新设置容器大小,默认使用0填充
	printVector(vectorD);
	vectorD.resize(8, 3); //重新设置容器大小,显示调用3填充
	printVector(vectorD);
	vectorD.resize(2);    //重写设置大小,截断后面多余部分
	printVector(vectorD);
	//4.容器末尾添加和删除元素
	cout << "4.容器末尾添加和删除元素" << endl;
	vector<int>vectorE;
	vectorE.push_back(1);//从末尾插入元素
	vectorE.push_back(3);
	vectorE.push_back(5);
	vectorE.push_back(7);
	vectorE.push_back(9);
	printVector(vectorE);
	vectorE.pop_back();//从末尾弹出元素
	vectorE.pop_back();
	printVector(vectorE);
	//5.vector数据元素的存取
	cout << "5.vector数据元素的存取" << endl;
 
	cout << vectorE[0]<< endl;//根据下标求容器对应位置的值
	cout << vectorE.at(1) << endl;
	cout << vectorE.front() << endl;  //返回开始位置元素
	cout << vectorE.back() << endl;   //返回末尾元素
	for (vector<int>::iterator it = vectorE.begin(); it != vectorE.end(); ++it) //it++前面++返回引用,后者++返回值
		cout << *it << " ";                                                     //正向遍历,而且是可以修改的
	cout << endl;
	for (vector<int>::reverse_iterator it = vectorE.rbegin(); it != vectorE.rend(); ++it)
		cout << *it << " ";                                                         //反向遍历 ,而且是可以修改的
	cout << endl;
	for (vector<int>::const_iterator it = vectorE.begin(); it != vectorE.end(); ++it)//it++前面++返回引用,后者++返回值
		cout << *it << " ";                                                     //正向遍历,不可以修改的,是常指针
	cout << endl;
	for (vector<int>::const_reverse_iterator it = vectorE.rbegin(); it != vectorE.rend(); ++it)
		cout << *it << " ";                                                     //反向遍历 ,不可以修改的,是常指针*/
	cout << endl;
	//6.插入操作
	cout << "6.插入操作" << endl;
	vector<int>vectorF(1);    //填入设置的大小,默认为0
	vector<int>vectorG(2);    //填入设置的大小,默认为0
	cout << "vectorF" << endl;
	printVector(vectorF);
	cout << "vectorG" << endl;
	printVector(vectorG);
	vectorF.insert(vectorF.begin(), 11);        //从vectorF.begin()开始插入此元素
	cout << "vectorF insert1" << endl;
	printVector(vectorF);
	vectorF.insert(vectorF.begin() + 1, 2, 22); //从vectorF.begin()开始插入n个此元素
	cout << "vectorF insert2" << endl;
	printVector(vectorF);
	vectorF.insert(vectorF.begin(), vectorG.begin(), vectorG.end());//从vectorF.begin()开始将整个区间的元素插入此位置
	//7.删除和清除操作
	cout << "7.删除和清除操作" << endl;
	printVector(vectorF);
	vectorF.clear();//删除此容器内的所有元素
	printVector(vectorF);
	vector<int>::const_iterator it = vectorF.begin(); //常指针,删除会报错
	vectorF.erase(it);           //删除位置上的元素,但是参数是迭代器
	// 删除的时候该函数返回的是删除位置的下一个位置的迭代器
	vectorF.erase(it, it + 3);   //删除迭代器所指向的区间的元素
 
	return 0;
}

2.迭代器失效

(1)insert时(可能会增容),增容后会出现野指针,从而引发迭代器失效;

(2)erase时(vs报错,但linux并不一定报错),如果删的是最后一个位置,就会会出现越界的情况,也就是空间不够,从而引发迭代器失效;

通俗讲

vector<int>::iterator it = vectorE.begin(); it != vectorE.end(); ++it) 
   通过it迭代器增加或者删除

在获取到vector对象的首元素地址后,后面在进行插入和删除进行操作时,有可能会发生vector的自动扩容或者缩容,因此导致it迭代器指向的地址不一样,导致迭代器失效

猜你喜欢

转载自blog.csdn.net/alpha_love/article/details/113789400
今日推荐