首页 > 代码库 > STL之vector
STL之vector
1.vector是一种动态数组,支持快速随机访问,因而元素是连续存储的,当没有空间容纳新元素,容器必须分配新的内存空间将之前的的元素移到新的空间然后添加新的元素释放旧空间。如果每添加一个新的元素就要进行一次这样的操作,vector性能就非常差了,为了提高性能,vector在分配内存空间时通常会分配预留空间来容纳新的元素,这样就不用每次都重新分配内存了。这样就引出了vector非常重要的两个数据。size和capacity:size表示vector大小(实际元素个数),capacity表示vector在未重新分配内存空间的容量(可容纳元素个数)而实际分配多少预留空间要看编译器如何实现。(v.size()与v.capacity())
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 int _tmain(int argc, _TCHAR* argv[]) 5 { 6 vector<int> v; 7 for(int i = 0;i<10;++i) 8 { 9 v.push_back(i); 10 cout << "size: " << v.size() << " capacity: " << v.capacity() <<endl; 11 } 12 return 0; 13 }
2.vector初始化
vector<T> v1; //空vector
vector<T> v2(v1);//v2中包含v1的所有元素
vector<T> v2=v1;//同上一种方式
vector<T> v3(n,val);//v3中包含n个val
vector<T> v4(n);//v4含有n个数据,数据均已缺省构造产生。
vector<T> v5{a,b,c};//v5中包含a,b,c三个元素(列表初始化方式,C++11赋值新方式,VS2012还不支持)
vector<T> v5={a,b,c};//同上一中方式
vetor<T> v6(v1.begin(),v1.end())//begin,end方式
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 int _tmain(int argc, _TCHAR* argv[]) 5 { 6 vector<int> v1; 7 for(int i = 0;i<10;++i) 8 { 9 v1.push_back(i); 10 } 11 for(int i:v1){ 12 cout<<i<<" "; 13 } 14 cout<<endl; 15 vector<int> v2(v1); 16 for(int i:v2){ 17 cout<<i<<" "; 18 } 19 cout<<endl; 20 vector<int> v3=v1; 21 for(int i:v3){ 22 cout<<i<<" "; 23 } 24 cout<<endl; 25 vector<int> v4(10,5); 26 for(int i:v4){ 27 cout<<i<<" "; 28 } 29 cout<<endl; 30 vector<int> v5(10); 31 for(int i:v5){ 32 cout<<i<<" "; 33 } 34 cout<<endl; 35 vector<int> v6(v1.begin()+1,v1.end()-2); 36 for(int i:v6){ 37 cout<<i<<" "; 38 } 39 cout<<endl; 40 return 0; 41 }
3.添加元素与下标操作(v.push_back())
vector向尾端添加元素 v.push_back(val);
在这里不能采用下标的方式添加元素,下面这种方式是错误的。
1 vector<int> v; 2 for(int i=0;i!=10;++i){ 3 v[i]<<=i; 4 }
而且虽然vector预留的空间比已知的空间大,但是只能对已知的空间进行下标操作
4.vector的遍历(三种,分别是简单for循环,迭代器遍历和利用v.size()的一般for循环 v.begin()与v.end())
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 int _tmain(int argc, _TCHAR* argv[]) 5 { 6 vector<int> v; 7 for(int i=1;i!=10;++i){ 8 v.push_back(i); 9 } 10 for(int i:v){ 11 cout<<i<<" "; 12 } 13 cout<<endl; 14 for(vector<int>::iterator it=v.begin();it!=v.end();++it){ 15 cout<<*it<<" "; 16 } 17 cout<<endl; 18 for(int i =0;i!=v.size();++i){ 19 cout<<v[i]<<" "; 20 } 21 cout<<endl; 22 return 0; 23 }
5.vector其它操作
v.assign(begin,end) //将[begin; end)区间中的数据赋值给v。
v.assign(n,elem) //将n个elem的拷贝赋值给v。
v.at(id) //传回索引id所指的数据,如果id越界,抛出out_of_range。
v.clear() //移除容器中所有数据。(内存还在)
v.~vector<T>() //销毁数据,释放内存
v.empty() //判断容器是否为空。
v.insert(pos,elem) // 在pos位置插入一个elem拷贝,传回新数据位置(位置指传回地址值)。
v.insert(pos,n,elem)//在pos位置插入n个elem数据。无返回值。
v.insert(pos,begin,end)//在pos位置插入在[begin,end)区间的数据。无返回值。
v.erase(pos) //删除pos位置的数据,传回下一个数据的位置。
v.erase(begin,end) //删除[begin,end)区间的数据,传回下一个数据的位置。
v.rbegin() // 传回一个逆向队列的第一个数据。
v.rend() //传回一个逆向队列的最后一个数据的下一个位置。
对比v.begin()和v.end(),说明利用v.rbegin()和v.rend可以逆向遍历
1 vector<int> v(10); 2 for (int i = 0; i < 10; i++) 3 v[i] = i + 1; 4 for (vector<int>::reverse_iterator rit = v.rbegin(); rit != v.rend(); rit++) 5 cout << *rit << " "; 6 cout << endl;
v.pop_back() //删除最后一个数据。
v.front() //传回第一个数据。
v.back() // 传回最后一个数据
front()和back()可以作为左值,说明函数的返回值返回了引用,是可以修改的。
v1.swap(v2) //将v1和v2元素互换。
swap(v1,v2) // 同上操作。
v.resize(n) //调整v的元素个数为n,如果n<v.size(),多出去的元素会被丢弃;但是预分配的内存空间是不会发生变化的。
v.resize(n,elem)//调整v的元素个数为n,没有添加元素时初始化为elem
v.reserve(n)//分配n个元素空间,不影响容器中元素个数。如果n<v.capacity(),什么也不做,不会退回内存空间。因而这个函数不会减小容器内存空间,更不会丢弃元素。
因而capacity只会在内存空间不够时增大,而不会减小。
STL之vector