总结
1)vector我们可以理解为 就是一个变成数组。
2)知道怎么定义 typename 可以很多类型
vector name;
3)访问,两种方式,一个给数组一样用下标,一种用迭代器
4)vi.begin(),vi.end() 还有 6个函数的用法
1,vector
vector 是干嘛的?
我们可以理解vector 为一个变长数组,也就是说他是个数组,但是长度可长可短。
使用vector 需要+ 上头文件 #include
vector name;
上面定义实际相当于一个一维数组 name【SIZE】,只不过其长度可以根据需要进行变化。比较节省空间,通俗的理解就是 “变长数组”
和一维数组一样,这里的typename 可以是人和基本类型,如Int, double, char, 等,也可以是 STL标准容器,如 vector, set, queue,等,如果typename也是一个STL容器,定义的时候要记得 在 >> 符号间+上空格。
vector name;
vector name;
vector name;
vector name; //node是结构体
这都好理解一看就会
然后我们看一下typename 是vector
vector > name // >>之间要+空格
这种定义不就很好理解了么,2维的变长数组,每一个纬度都是长度可变的。
然后看下vector定义数组的方法
vector Arrayname[arraySize];
例如
vector vi[100]
这个vi是个二维数组,Arrayname[0] ~~ Arrayname[arraySize - 1]中每一个元素都是一个vector容器
与vector
1)通过下标
和普通数组一样,对一个定义为vector
2)通过迭代器访问
迭代器(iterator)可以理解为一个类似指针的东西。
vector::iterator it;
这样it就是一个vector
vector::iterator it;
vector::iterator it;
我们得到了迭代器it,并且可以通过*it来访问vector里的元素。
例
vector vi;
for(int i = 1; i <= 5; i++){
vi.push_back(i); //push_back(i)在vi的末尾添加元素i,即依次添加1 2 3 4 5
}
然后我们来访问一下
#include
#include
using namespace std;
int main(){
vector vi;
for(int i = 1; i <= 5; i++){
vi.push_back(i);
}
//vi.begin()为取vi首元素的地址,而it指向这个地址
vector::iterator it = vi.begin();
for(int i = 0; i < 5; i ++){
printf("%d ", *(it + i));
}
return 0;
}
我们可以看出
vi[ i ] 和 *(vi.begin() + i)等价
既然我们提到了begin()函数的作用是取首地址,那么这里还要提到end()函数,和begin()不同的是,end()并不是取vi尾元素的地址,而是去尾元素地址的下一个地址,end()作为迭代器末尾的标志,不存储任何元素
除此之外,迭代器还是实现了两种自加操作:it++ 和 ++it(自减同理)于是另一种遍历方法诞生了
#include
#include
using namespace std;
int main(){
vector vi;
for(int i = 1; i <= 5; i++){
vi.push_back(i);
}
//vector的迭代器不支持it < vi.end()的写法,因此循环条件只能用it != vi.end()
for(vector::iterator it = vi.begin(); it != vi.end(); it++){
printf("%d ", *it);
}
return 0;
}
在STL容器中,只有在vector和string 中,才允许使用vi.begin() + 3这种迭代器+整数的写法。
3)几个函数的用法
(1)push_back()
顾名思义,push_back(x)就是在vector后面添加一个元素,时间复杂度为 O(1);
#include
#include
#include
using namespace std;
int main(){
vector vi;
for(int i = 1; i <= 5; i++){
vi.push_back(i);
}
for(int i = 0; i < vi.size(); i++){
cout << vi[i] << " ";
}
return 0;
}
(2)pop_back()
有添加就会有删除,这个函数的作用就是删除 vector 的尾元素,时间复杂度为 O(1)
#include
#include
#include
using namespace std;
int main(){
vector vi;
for(int i = 1; i <= 5; i++){
vi.push_back(i);
}
vi.pop_back();
for(int i = 0; i < vi.size(); i++){
cout << vi[i] << " ";
}
return 0;
}
(3)size()
size()函数用来获得vector中元素的个数时间复杂度为 O(1),注意一点 size()返回的是unsigned类型,不过一般用 %d不会有太大问题,这一点对所有STL容器都一样
#include
#include
#include
using namespace std;
int main(){
vector vi;
for(int i = 1; i <= 5; i++){
vi.push_back(i);
}
cout << vi.size() << endl;
return 0;
}
(4)clear()
用来清空vector中的所有元素,时间复杂度为O(N),N为vector中元素的个数
#include
#include
#include
using namespace std;
int main(){
vector vi;
for(int i = 1; i <= 5; i++){
vi.push_back(i);
}
vi.clear();
cout << vi.size() << endl;
return 0;
}
(5)insert()
insert(it, x)用来想vector 的任意迭代器it处插入一个元素x,时间复杂度为 O(N)
#include
#include
#include
using namespace std;
int main(){
vector vi;
for(int i = 1; i <= 5; i++){
vi.push_back(i);
}
vi.insert(vi.begin() + 2, -1);
for(int i = 0; i < vi.size(); i++){
cout << vi[i] << " ";
}
return 0;
}
(6)erase()
两种用法,删除单个元素,删除一个区间内所有的元素,时间复杂度均为O(N)
#include
#include
#include
using namespace std;
int main(){
vector vi;
for(int i = 1; i <= 5; i++){
vi.push_back(i);
}
vi.erase(vi.begin() + 3);
for(int i = 0; i < vi.size(); i++){
cout << vi[i] << " "; //1 2 3 5
}
return 0;
}
注意一点,erase(left, right),删除 [ left,right)内所有元素
#include
#include
#include
using namespace std;
int main(){
vector vi;
for(int i = 1; i <= 5; i++){
vi.push_back(i);
}
vi.erase(vi.begin() + 1, vi.begin() + 4);
for(int i = 0; i < vi.size(); i++){
cout << vi[i] << " ";// 1 5
}
return 0;
}
删一个区间内
vi.erase(vi.begin(), vi.end());