vector的用法
vector相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,
用其来解决问题可以达到最大节约空间的目的.
就是常数很大,但要是开了O2,一切都不是问题。
就像数组一样,vector也采用的连续存储空间来存储元素。
也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。
但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
但是对于编程来讲,我们只会用就可以了。
NEXT,用法奉上。
1.vector的元素不仅仅可以是int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。
2.当然,要有头文件#include<vector>
3.我们以vector<int>a;为例
基本上包含了vector的常用函数(不够再补)
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define DB double 4 using namespace std; 5 const int tmp=100; 6 vector<int>a;//创建vector对象 7 vector<int>b(6,9); 8 /*vector的声明及初始化 9 vector<int> a; //声明一个int型向量 10 vector<int> a(5); //声明一个初始大小为5的int向量 11 vector<int> a(10, 1); //声明一个初始大小为10且值都是1的向量 12 vector<int> a(tmp); //声明并用tmp向量初始化vec向量 13 vector<int> tmp(a.begin(), a.begin() + 3); //用向量vec的第0个到第2个值初始化tmp 14 int arr[5] = {1, 2, 3, 4, 5}; //下标依旧是从0开始 15 vector<int> a(arr, arr+ 5); //将arr数组的元素用于初始化vec向量 16 //说明:当然不包括arr[4]元素,末尾指针都是指结束元素的下一个元素, 17 //这个主要是为了和vec.end()指针统一。 18 vector<int> vec(&arr[1], &arr[4]); //将arr[1]~arr[4]范围内的元素作为vec的初始值 19 */ 20 int main() 21 { 22 for(int i=11;i<=20;++i) a.push_back(i);//尾部插入数字,下标从0开始 23 cout<<a.front()<<endl;//传回第一个数据 24 cout<<a.back()<<endl;//传回最后一个数据 25 cout<<a.capacity()<<endl;//返回容器当前能够容纳的元素数量 26 cout<<a.size()<<endl;//返回当前容器中实际的元素个数 27 cout<<a.empty()<<endl;//判断容器是否为空,空是1,非空是0 28 cout<<a.max_size()<<endl;//返回容器可以存储的最多元素数目 29 for(int i=0;i<a.size();++i) cout<<a.at(i)<<" ";cout<<endl;//a.at(i)得到编号位置的数据 30 /*****************************************************************************************/ 31 /* lower_bound(a.begin(),a.end(),x) 返回>=x的第一个数的下标(指针) 32 upper_bound(a.begin(),a.end(),x) 返回>=x的第一个数的下标(指针) 33 *************************************************************************************************/ 34 for(int i=1;i<=10;++i) cout<<a[i-1]<<" ";cout<<endl;//使用下标访问元素 35 std::vector<int>::iterator it; 36 for(it=a.begin();it!=a.end();++it) cout<<*it<<" ";cout<<endl;//使用迭代器访问元素 37 /*a.begin() 返回指向容器第一个元素的迭代器 38 a.end() 返回指向容器最后一个元素的迭代器*/ 39 /******************************************************************************************/ 40 a.insert(a.begin()+4,211);//a.insert(a.begin()+i,a);在第i个元素后面插入a;传回新数据位置的迭代器 41 for(it=a.begin();it!=a.end();++it) cout<<*it<<" ";cout<<endl; 42 a.insert(a.begin()+5,3,985); 43 for(it=a.begin();it!=a.end();++it) cout<<*it<<" ";cout<<endl; 44 /****************************************************************************************/ 45 a.erase(a.begin()+4);//a.erase(a.begin()+i);删除第i+1个元素;传回下一个数据的位置的迭代器 46 for(it=a.begin();it!=a.end();++it) cout<<*it<<" ";cout<<endl; 47 a.erase(a.begin()+1,a.begin()+4);//a.erase(a.begin()+i,a.end()+j);删除区间[i,j-1];区间从0开始;传回下一个数据的位置的迭代器 48 for(it=a.begin();it!=a.end();++it) cout<<*it<<" ";cout<<endl; 49 /***********************************************************************************************/ 50 a.pop_back();//删除最后一个数据 51 for(it=a.begin();it!=a.end();++it) cout<<*it<<" ";cout<<endl; 52 vector<int>::reverse_iterator p; 53 for(p=a.rbegin();p!=a.rend();++p) cout<<*p<<" ";cout<<endl; 54 /*a.rbegin() 传回一个逆向的第一个数据的迭代器 55 a.rend() 传回一个逆向的最后一个数据的下一个位置的迭代器 */ 56 /**************************************************************************************************/ 57 a.resize(6);//重新指定队列的长度,即只剩前六个元素,剩下的元素都删除了 58 for(it=a.begin();it!=a.end();++it) cout<<*it<<" ";cout<<endl; 59 a.reserve(100);//增加队列容量,就是reserve增加的空间未被初始化不能引用 60 cout<<a.size()<<endl; 61 /***********************************************************************************************/ 62 swap(a[3],a[0]);//交换队列中的两个元素 63 for(it=a.begin();it!=a.end();++it) cout<<*it<<" ";cout<<endl; 64 a.clear(); cout<<a.size()<<endl;//a.clear();清除a中的内容 65 a.swap(b);//交换a,b,两个向量的内容 66 for(it=a.begin();it!=a.end();++it) cout<<*it<<" ";cout<<endl; 67 cout<<b.size(); 68 return 0; 69 }