STL的vector
vector是表示可变大小的序列容器,可以动态增长,采用连续的存储空间来存储元素,可以直接用下标进行访问,相对于其他的动态序列容器来说,vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效,不在末尾删除和插入则效率低
与数组相比:
优点:
使用时无需申明上限,vector的长度会自动增加
Vector在增加删除元素上比数组高效
缺点:
时间:运行速度比数组慢
空间:clear()无法清空内存
vector的使用
1:增加元素
push_back
insert
//int型vector,包含3个元素 vector<int> v(3); //int型vector,包含3个元素且每个元素都是9 vector<int> v2(3,9); v[0]=2; //v[0]是第0个元素 v[1]=7; v.insert(v.begin(),8);//在最前面插入新元素。 v.insert(v.begin()+2,1);//在迭代器中第二个元素前插入新元素 v.insert(v.end(),3);//在向量末尾追加新元素。 v.insert(v.end(),4,1);//在尾部插入4个1 //插入1 2 v.push_back(1); v.push_back(2);
|
2:输出数据(三种)
for(int i=0;i<nSize;i++) { cout<<vecIntA[i]<<" "; } |
for(int i=0;i<nSize;i++) { cout<<vecIntA.at(i)<<" "; } |
for(vector<int>::iterator it = vecIntA.begin();it!=vecIntA.end();it++) { cout<<*it<<" "; } |
3:删除元素
pop_back();末尾删除元素
erase();任意位置删除元素
v.pop_back();
v.erase( v.begin());//删除v1中的第一个元素 v.erase(v.begin()+2);//删除第3个元素 v.erase(vec.begin()+i,v.begin()+j);//删除区间[i,j-1];区间从0开始
|
4:清空和判断空
clear() 和empty()
5:数据访问
下标访问: vec[1]; //并不会检查是否越界
at方法访问: vec.at(1); //以上两者的区别就是at会检查是否越界,是则抛出out of range异常
访问第一个元素: vec.front();
访问最后一个元素: vec.back();
返回一个指针: int* p = vec.data();
6:反转
reverse(vec.begin(), vec.end());////头文件#include<algorithm>
7:交换
交换两个向量的元素: swap(v2);///与另外一个vector交换数据
8:修改元素
修改元素的方法主要有三种:1.通过数组修改,2.通过引用修改,3.通过迭代器修改
//通过数组修改vector vecIntA[1]=8; |
//通过引用修改vector cout<<"通过引用修改,第二个元素为18:"<<endl; int &m = vecIntA.at(1); m=18; |
//通过迭代器修改vector vector<int>::iterator itr = vecIntA.begin()+1; *itr = 28;
|
9::排序
sort(vec.begin(), vec.end());////头文件#include<algorithm
sort(vec.begin(), vec.end()); //采用的是从小到大的排序 //如果想从大到小排序,可以采用上面反转函数,也可以采用下面方法: bool Comp(const int& a, const int& b) { return a > b; } sort(vec.begin(), vec.end(), Comp); |