介绍:在C++中vector作为一种容器与string类一样 vector 类是随标准 C++引入的标准库的一部分,使用时需引用头文件 #include < vector >。vector 是同一种类型的对象的集合。
一.vector与静态数组的异同.
相同点:
①vector和静态数组都只能对同一类型的数据进行储存。
②两者储存是连续的,可也进行随机访问。
③都可用下标进行处理。
不同点:
①vector的长度一般不固定,可以根据数据的插入和删除重新构造容器容量,数据的而数组的长度已经固定,因此vector也避免数组越界等问题。但vector数组也存在一定的弊端。
②vector可也通过size(),empty()来判断容器的大小或者是否为空,而数组只能通过 sizeof()和strlen()来判断。
③可将vector视为动态数组。相比数组,在不知道数据规模时可以使用vector来节约空间,在竞赛和刷题中,如果空间紧张,可使用STL的vector建立动态数组,不仅节约空间,而且不容易出错。
注意:若要创建非空的vector对象,就必须初始化元素的值。且vector与其他STL容器都必须访问已存在的元素,否则会出现段错误。
二.vector的常用操作
1.初始化
vector<int> v;
vector<int> v(10);
vector<int> v(10,1);
第一种方式默认初始化,vector为空, size为0,表明容器中没有元素,意味着还没有分配内存空间。这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况。
第二种方式默认值初始化,v中将包含10个元素,每个元素进行缺省的值初始化,对于int,也就是被赋值为0,因此v被初始化为包含10个0。当程序运行初期元素大致数量可预知,而元素的值需要动态获取的时候,可采用这种初始化方式。
第三种方式与第二种相同,只是初始化值变成了1
vector<int> v(v1);
vector<int> v(v1.begin(),v1.begin()+5);
int a[5]={1,2,3,4,5}; vector<int> v(a,a+7);
vector<int> v={1,2,3,4,5,6,7};
第一种是以vector< int >v1的全部元素整体复制性建立v
第二种是以vector< int >v1的前5个元素即{1,2,3,4,5}来建立v
这里要注意这种写法只适用于相同数据类型的vector。
vector<string> v(10,"fuck");
这里是string类型的vector,容器内初始化了10个“fuck”字符串。
struct node{int x,y};
vector<node> v;
类似的定义结构体数组,这里可以用v来存储坐标。
vector<int> v[MAXN]
还可以定义多维数组,例如上文定义了一个二维数组,他的第一维是固定的MAXN,而第二位贼是动态的。用这个方式可以实现图的邻接矩阵。
2.赋值和插入元素
for(int i=0;i<3;i++) v.push_back(i);
从尾部插入0,1,2。vector的下标也是从0开始,所以v[0]=0,v[1]=1,v[2]=2。
vector<int> v(10)
for(int i=1;i<=3;i++) v[i]=i+1;
类数组方式建立的vector因为已经默认值初始化,可以直接对范围内的元素直接赋值,这里v[0]=0,v[1]=2,v[2]=3,v[3]=4,v[4]=0,v[5]=0…
v.insert(v.end(),10,5); 在尾部插入10个值为5的元素
v.insert(v.begin()+i,k); 是在第i个元素前面插入k。
3.删除与清空
v.pop_back(); 删除末尾元素
v.erase(v.begin()+i,v.begin()+j); 删除区间[i,j-1]的元素
v.erase(v.begin()+2); 删除第3个元素
v.clear(); 清空
4.其他重要操作
sort(v.begin(),v.end()); 用sort()函数从小到大进行排序
reverse(v.begin(),v.end()); 用reverse()函数翻转数组
v.size() 返回容器的大小
v.empty() 判断容器是否为空,为空返回0,不为空则为1
cout<<v[0]; 打印第一个元素
cout<<v[v.size()] 打印最后一个元素
lower_bound(v.begin(),v.end(),a) 在有序数组中返回第一个大于等于a的元素的下标,返回值的是地址
upper_bound(v.begin(),v.end(),a)-v.begin() 在有序数组中返回第一个大于a的元素的下标,这里通过减去首地址,得到了下标位置
vector<int>::iterator it; 定义迭代器方便得到元素值,相当于指针
it=upper_bound(v.begin,v.end(),a)
cout<<(*it) 这里返回的是第一个大于a的元素的值
三.vector的巧妙运用
由于C++中许多存在许多内置函数,使得vector操作方便高效。其作为动态数组在节约空间,灵活插入与删除,改变数组序列的同时,可以模拟动态变化,在某些数组序列问题中可以起到模拟,存放,保存结果等作用。我会在接下来的时间里不断的更新vector妙用。