STL之vector用法总结
vector是一种顺序容器,有大小限制,但是可以动态的扩展,不能减小对应的空间,同数组一样,是线性排列的,在其尾不插入删除效率很高,中间的插入删除效率一般,可以向数组一样随机访问表中的元素。STL中的数据结构,都可以使用自定义的数据类型,便于扩展。
头文件:#include<vector>
using namespace std ;
1.创建对象与初始化:
(a) vector<T> v ;//创建一个T类型的vector,此时vector为空,容量为0.
(b) vector<T> v (n);//创建一个T类型的vector,容量为n
(c) vector<T> v(v1) ;//创建一个T类型的vector,为v1的一个拷贝,要求数据类型相同。
(d) vector<T> v(n1 , n2) ;//创建一个T类型的vector,含n1个元素,每个元素的值都为n2 ;
(e) vector<T>v(v1.begin() , v2.end()) ;//创建一个T类型的vector对象v,元素为区间[v1.begin() , v1.end())的元素。
2.assign()//分配值
与list相同有两中使用方式:
v.assign(v1.begin() , v1.end()) ;//如果v1中的元素为7个4,此时v中有7个4,后面的元素默认初始化为0
v.assign(7 , 4) ;//v中的元素为7个4,如果原来v的大小没有7,那么会申请空间到7个。
3.back();//返回最后一元素,与list相同
4.begin();//返回第一个元素的迭代器,这些与list都相同
5.capacity();//返回vector所能容纳的元素数量(在不重新分配内存的情况下)
6.clear();//清空所有元素。
7.empty();//判断vector是否为空(返回true时为空)
8.end();//返回最末元素的迭代器(译注:实指向最末元素的下一个位置)
9.erase();//删除节点内容用到了erase()函数,有两个重载:
iterator erase( iterator loc );
iterator erase( iterator start, iterator end );
这两个迭代操作尤其需要注意,涉及到迭代器的操作都需要考虑迭代器的时效性,操作完后,迭代器就失效了,需要重新复制,才能合法访问。
10.front() ;//返回第一个元素
11.get_allocator();//返回vector的内存分配器,感觉不怎么常用
12.insert() ;//插入元素到vector中,运用类似与list的insert,含有三种形式,在指定位置,插入一个或者多个元素;
如:
v1.insert(v1.begin() + 10 , 5);//在第11个位置插入一个元素值为5。
v1.insert(v1.begin() , v.begin() , v.end());//在v1的开始将v的元素依次插入到v1中。
v2.insert(v2.begin() , 5 , 100) ;//在v2的开头插入5个100
13.max_size();//返回vector所能容纳元素的最大数量(上限)
14.pop_back();//移除最后一个元素
15.push_back();//在vector最后添加一个元素
16.rbegin();//返回vector尾部的逆迭代器
17.rend();//返回vector起始的逆迭代器
18.reserve();//设置vector最小的元素容纳数量
19.resize();//改变vector元素数量的大小,重新设定大小
20.size();//返回vector元素数量的大小
21.swap() ;//交换两个vector,此处传递的是地址,不是值传递,按引用方式传递,会发生实际交换。
22.关于vector的访问方式
前面说过vector的访问方式就像数组一样,vector有三种访问方式:
1. v.at(n) ;//访问地n个元素,此时要确保不能越界。
2. v[n] ;像数组一样直接访问第n个元素,同样保证不能越界
3. 使用迭代器顺序访问:
vector<int> ::iterator it ;
for(it=v2.begin() ; it!=v2.end() ; it ++)
{
cout<<(*it) + 5<<endl ;
}
在使用迭代器的时候注意迭代器的使用范围,特别是对于增删操作的时候,尤其当心迭代器的范围,很容易导致迭代器失效。并且迭代器的效率一般不是很高,如果可以使用下表形式,最好使用下标形式来遍历以及操作对象中的元素。
vector的一个简单使用例子:
#include<iostream> #include<string.h> #include<stdio.h> #include<vector> using namespace std ; int main() { vector<int> v(10) ; cout<<v.size()<<endl ; vector<int> v1(10 , 2) ; int i ; i =0 ; /* while(i < 10) { cout<<v1[i]<<endl ; i++ ; } */ vector<int> v2(20) ; cout<<v2.size()<<endl ; v2.assign(v1.begin() , v1.end()) ; i = 0 ; while(i<20) { cout<<v2[i]<<endl ; i++ ; } cout<<v2.capacity()<<endl ; v2.assign(30,4) ; i = 0 ; v2.insert(v2.begin() , 5 , 100) ; while(i<30) { cout<<v2[i]<<endl ; i++ ; } cout<<v2.size()<<endl ; cout<<endl ; vector<int> ::iterator it ; for(it=v2.begin() ; it!=v2.end() ; it ++) { cout<<(*it) + 5<<endl ; } cout<<"swap"<<endl; v2.swap(v1) ; for(it=v2.begin() ; it!=v2.end() ; it ++) { cout<<(*it) + 5<<endl ; } return 0 ; }
关于vector与STL中的算法的组合使用,会在后面的STL算法中继续介绍。