vector容器的应用,感觉最近做的题目还用的挺多
vector与常用数组大部分是相同的,可以进行插入,删除之类的,但是,有些题目,用普通的数组就很容易爆掉,而vector可以动态的根据你所需要的来调整大小。
所以说vector向量不但能像数组一样对元素进行随机访问,还能在尾部插入元素,是一种简单,高效的容易,完全可以代替数组。
比如 一维数组 vector <int > v;
二维数组 vector <int *> v;
三维数组 vector <int **> v;
一些基本用语
erase 删除
insert 插入
begin 指向头指针
end 指向尾元素+1的尾部位置
empty 判断是否为空
push_back 向容器尾部加入新的数字
pop_back 去掉容器最后一个数字
clear 清空整个容器
size 表示容器所包含的数字
首先最基本的,对于正常的容器进行最基本的插入数据方法
#include<vector> using namespace std; int main() { vector<int> v; v.push_back(2); v.push_back(7); v.push_back(9); return 0; }
还有另一种,直接用下标定义的 注意这个v(3) 与普通数组一样,是从0开始计数的,3代表大小。
vector <int > v(3); v[0]=2; v[1]=7; v[2]=9;
接着,接触到了一种新东西,迭代器
具体什么原理也还没太清楚,但是大概知道,不论是vector还是string都可以用这种迭代器来表示长度之类的。
#include<vector> #include<iostream > using namespace std; int main() { vector<int> v(3); v[0]=2; v[1]=7; v[2]=9; vector<int> :: iterator it; ///定义了一个迭代器变量 for(it=v.begin();it!=v.end();it++) ////从容器的首位开始便利到结束 { cout<<*it<<" "; } cout<<endl; return 0; }
接下来是元素的插入方法,用到了insert()
其可以再vector 对象的任意位置前插入一个新的元素,同时,vector 会自动扩张一个元素空间,插入位置后的所有元素依次向后挪动一个位置
要注意的是,insert()方法要求插入的位置,是元素的迭代器位置,而不是元素的下标。
#include<vector> #include<iostream> using namespace std; int main() { vector<int> v(3); v[0]=2; v[1]=7; v[2]=9; v.insert(v.begin(),8); ////在最前面插入新元素,元素值为8。 v.insert(v.begin()+2,1); ////在第2个元素前插入新元素1。 v.insert(v.end(),3); ///在向量末尾追加新元素3。 vector<int> :: iterator it; for(it=v.begin();it!=v.end();it++) { cout<<*it<<" "; } cout<<endl; return 0; }
这组数据的输出结果是 8 ,2 ,1 ,7 ,9 ,3;2
元素的删除方法,用到了erase()或者clear()
erase()方法可以删除vector中迭代器所指的一个元素或一段区间中的所有元素
clear()方法则是一次性删除vector中的所有元素
代码如下
#include<vector> #include<iostream> using namespace std; int main() { vector<int> v(10); for(int i=0;i<10;i++) v[i]=i; v.erase(v.begin()+2); ///删除 2 个元素,从0开始计数 vector<int> :: iterator it; for(it=v.begin();it!=v.end();it++) { cout<<*it<<" "; } cout<<endl; v.erase(v.begin()+1,v.begin()+5); ///删除迭代器中第1 到第 5 区间的所有元素 (删除1 2 3 4 这4个) for(it=v.begin();it!=v.end();it++) { cout<<*it<<" "; } cout<<endl; v.clear(); cout<<v.size()<<endl; return 0; }
运行结果是
0 1 3 4 5 6 7 8 9
0 6 7 8 9
0
使用reverser反向排列算法
在头文件algorithm下,代码如下
#include<iostream> #include<algorithm> #include<vector> using namespace std; int main() { vector<int> v(10); for(int i=0;i<10;i++) { v[i]=i; } reverse(v.begin(),v.end());/// 反向排列向量的从首到尾间的元素 vector<int> :: iterator it; for(it=v.begin();it!=v.end();it++) { cout<<*it<<" "; } cout<<endl; return 0; }
输出结果是
9 8 7 6 5 4 3 2 1 0
使用sort算法对向量元素排序
sort默认为升序排列的,位于algorithm头文件下
#include<iostream> #include<algorithm> #include<vector> using namespace std; int main(int argc,char argv[]) { vector<int> v; int i; for(i=0;i<10;i++) { v.push_back(9-i); } for(i=0;i<10;i++) { cout<<v[i]<<" "; } cout<<endl; sort(v.begin(),v.end()); //////升序排列 for(i=0;i<10;i++) { cout<<v[i]<<" "; } cout<<endl; return 0; }
输出结果
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9
但是,可以自己设计比较函数,然后把函数指定给sort算法,sort就按照自己所规定的规则进行排列。
例如自己设计一个比较函数Comp,对元素从大到小排序
#include<vector> #include<iostream> #include<algorithm> using namespace std; bool Comp(const int &a,const int &b) { if(a!=b) return a>b; else return a>b; } /////降序排列 int main(int argc,char *argv[]) { vector<int> v; for(int i=0;i<10;i++) { v.push_back(i); } for(int i=0;i<10;i++) { cout<<v[i]<<" "; } cout<<endl; sort(v.begin(),v.end(),Comp); 按照Comp 函数比较规则排序 for(int i=0;i<10;i++) { cout<<v[i]<<" "; } cout<<endl; return 0; }
输出结果
0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0
向量容器大小的统计
使用size() 可以返回容器大小,即元素的个数
使用empty() 可以判断容器是否为空 如果为空则返回逻辑真实值 1 ,如果为非空则返回逻辑假 0。
#include<iostream> #include<algorithm> #include<vector> using namespace std; int main() { vector<int> v(10); for(int i=0;i<10;i++) { v[i]=i; } cout<<v.size()<<endl; ///输出向量的大小,即包含了多少个元素 cout<<v.empty()<<endl; ///如果为空则输出 1 ,如果非空则输出 0 v.clear(); cout<<v.empty()<<endl; return 0; }
输出结果
10
0
1
以上大概就是vector的通常用法了。