vector的数据安排以及操作方式,与arrray(数组)相似。两者的区别在于:空间运用的灵活性。
vector是动态的空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。
1、vector的数据结构:
vector的数据结构为线性连续空间。它有两个迭代器_Myfirst和_Mylast,分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器_Myend指向整块连续内存空间的尾端。
2、vector的容量问题:
为了降低空间配置时的速度成本,vector实际配置的大小要比客户端的要求大一些,以备将来可能的扩充,这个就是容量的概念。
也就是说,一个vectoe的容量永远大于或等于其大小,一旦容量等于大小,便是满载,下次再有新增元素,整个vector容器就需要寻找新的空间。
3、vector的动态增加大小概念:
1、在vector中所谓的动态增加大小,并不是在原有空间之后接续新空间(无法保证原空间的后面还有足够的空间来配置)。相反,会去寻找一块更大的内存空间,然后将原数据拷贝到新空间,并释放掉旧空间。
2、 所以,需要明白的一点是,在vector中一旦引起空间的重新配置,那么指向原vector的所有迭代器都会失效。
4、vector的插入删除操作:
//在pos处插入count个元素ele insert(const_iterator pos,int count,ele); //从尾部插入元素 push_back(); //从尾部删除元素,即删除最后一个元素 pop_back(); //删除从start到end之间的元素 erase(const_iterator start,const_iterator end); //删除这个位置的元素 erase(const_iterator pos); //删除所有元素 clear();
例:
#includeusing namespace std; #include void print(vector &v) { vector ::iterator it;//定义vector容器的迭代器 it for(it=v.begin(); it!=v.end(); it++) { cout<<*it<<" "; } cout< vector v; vector ::iterator it; for(int i=1; i<=5; i++) { v.push_back(i); } cout<<"在起始处插入两个100:"< 5、vector的构造函数:
//采用模板类实现,默认构造函数 vectorv; //将v[begin(),end())区间中的元素拷贝给本身 vector(v.begin(),v.end()); //构造函数将n个elem拷贝给本身 vector(n,elem); //拷贝构造函数 vector(const vector& vec); 例:
#includeusing namespace std; #include int main() { vector v(5,5);//将5个5拷贝给容器v vector ::iterator it;//定义vector容器的迭代器 it cout<<"v容器:"; for(it=v.begin(); it!=v.end(); it++) { cout<<*it<<","; } cout< v2(v.begin(),v.end());//将v[begin(),end())区间中的元素拷贝给v2 for(it=v2.begin(); it!=v2.end(); it++) { cout<<*it<<","; } } 6、vector常用赋值操作:
//将[beg,end)区间中的数据拷贝赋值给本身 assign(beg,end); //将n个elem拷贝给本身 assgin(n,elem); //重载等号操作符 vector&operator=(const vector &vec); //将vec与本身的元素互换 swap(vec);例:
#includeusing namespace std; #include int main() { vector v3; int arr[]={2,3,4,1,9}; vector v(arr,arr+sizeof(arr)/sizeof(int));//类似于begin和end vector ::iterator it;//定义vector容器的迭代器 it for(it=v.begin(); it!=v.end(); it++) { cout<<*it<<","; } cout< cout<<*it<<","; } } //2,3,4,1,9 //2,3,4,1,9 7、vector的大小操作:
//返回容器中元素个数 size(); //判断容器是否为空 empty(); //重新指定容器长度为num,若容器边长,则以默认值填充新位置。若容器变短 //,则超出容器长度的元素被删除 resize(int num); //重新指定容器长度为num,若容器边长,则以elem值填充新位置。若容器变短 //,则超出容器长度的元素被删除 resize(int num,elem); //容器的容量 capacity(); //容器预留len个元素长度,预留位置不初始化,元素不可访问 reserve(int len);例1:
#includeusing namespace std; #include void print(vector &v) { vector ::iterator it;//定义vector容器的迭代器 it for(it=v.begin(); it!=v.end(); it++) { cout<<*it<<","; } cout< vector v; v.push_back(10); v.push_back(20); v.push_back(30); v.push_back(40); cout<<"元素个数: "< cout<<"v为空"< cout<<"v不为空"< 8、vector数据存取操作:
//返回索引idx所指的数据,如果idx越界,抛出out_of_range异常 at(int idx); //返回索引[]下标的数据,越界时,运行直接报错 operator[]; //返回第一个元素 front(); //返回最后一个元素 back();例:
#includeusing namespace std; #include void print(vector &v) { vector ::iterator it;//定义vector容器的迭代器 it for(it=v.begin(); it!=v.end(); it++) { cout<<*it<<","; } cout< vector v; vector ::iterator it; for(int i=0; i<5; i++) { v.push_back(i); } print(v); cout<<"v的第一个元素:"<



