目录
一、vector的介绍和使用
1.1 vector的介绍
使用STL的三个境界:能用,明理,能扩展,那么下面学习vector,我们也是按照这个方法去学习
1.2 vector的使用
vector学习时一定要学会查看文档:vector的文档介绍,vector在实际中非常的重要,在实际中,我门熟悉常见的接口就可以,下面列出了哪些接口是要重点掌握的。
使用vector要包含vector头文件
二、vector的构造函数
我们在vector的文档介绍可以看到vector的构造函数如下所示:

2.1 无参构造函数
#include<iostream>
using namespace std;
#include<vector>
int main() {
vector<int> v;
return 0;
}
2.2 构造并且初始化n个val
如果传参的时候没有写val值,就会调用这个类型的默认构造函数。
#include<iostream>
using namespace std;
#include<vector>
int main() {
vector<int> v(10,1);
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
return 0;
}
2.3 使用迭代器进行初始化构造
#include<iostream>
using namespace std;
#include<vector>
int main() {
vector<int> v(10, 2);
vector<int> v2(v.begin(), v.end());
for (int i = 0; i < v2.size(); i++) {
cout << v2[i] << " ";
}
cout << endl;
return 0;
}
2.4 拷贝构造
#include<iostream>
using namespace std;
#include<vector>
int main() {
vector<int> v(10, 2);
vector<int> v1(v);
for (int i = 0; i < v1.size(); i++) {
cout << v1[i] << " ";
}
cout << endl;
return 0;
}
三、vector的迭代器
在string类里面我们讲过,迭代器属于其对应容器的类域,所以我们在声明vector迭代器时,需要指定类域。
与string类似,vector也有八种迭代器,如下所示:

我们重点掌握的就是begin和end。代码如下:
#include<iostream>
using namespace std;
#include<vector>
int main() {
vector<int> v(10, 3);
vector<int>::iterator vit = v.begin();
while (vit != v.end()) {
cout << *vit << " ";
*vit++;
}
cout << endl;
return 0;
}
四、vector的空间增长问题
4.1 size
这个方法会返回vector容量里面的元素个数。
4.2 capacity
这个方法会返回vector实际开的空间是多少。我们在push数据时,会经常多开一点,为了避免一直扩容,代码如下所示:

4.3 empty
这个方法是判断vector是否为空
4.4 resize(重点)
函数原型如下:

这个函数是重新设置vector的size。n是重新设置的大小,第二个参数是大于原本的size时,需要插入的值,如果没有写,就使用vector类型的默认参数
具体有三种情况
1、n小于原本的size:
这种情况直接发生截断,大于n的部分直接丢弃。容量不变,代码如下:
#include<iostream>
using namespace std;
#include<vector>
int main() {
vector<int> v(10, 1);
v.resize(5);
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
cout << "capacity:" << v.capacity()<<endl;
return 0;
}
2、n大于原本的size,但是小于vector的容量:
这种情况会将size改为n,并向vector中添加元素,不会扩容。代码如下所示:
#include<iostream>
using namespace std;
#include<vector>
int main() {
vector<int> v(10, 1);
v.reserve(20);
cout << "capacity:" << v.capacity() << endl;
v.resize(15,9);
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
cout << "capacity:" << v.capacity() << endl;
return 0;
}
3、n大于原本的size,并且大于vector的容量:
这种情况会将size改为n,并向vector中添加元素,会扩容。代码如下所示:
#include<iostream>
using namespace std;
#include<vector>
int main() {
vector<int> v(10, 1);
v.reserve(20);
cout << "capacity:" << v.capacity() << endl;
v.resize(30, 9);
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
cout << "capacity:" << v.capacity() << endl;
return 0;
}
4.5 reserve(重点)
reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题,我们来看一下reserve的介绍:

1、当n大于原本的容量时,vector会增加容量到n或者增加到比n更大。代码如下所示:
#include<iostream>
using namespace std;
#include<vector>
int main() {
vector<int> v(10, 1);
cout << "size :" << v.size() << endl;
cout << "capacity:" << v.capacity() << endl;
v.reserve(50);
cout << "size :" << v.size() << endl;
cout << "capacity:" << v.capacity() << endl;
return 0;
}
2、当n小于原本的容量,大于size时,容量不变,代码如下所示:
#include<iostream>
using namespace std;
#include<vector>
int main() {
vector<int> v;
for (int i = 0; i < 20; i++) {
v.push_back(1);
}
cout << "size :" << v.size() << endl;
cout << "capacity:" << v.capacity() << endl;
v.reserve(25);
cout << "size :" << v.size() << endl;
cout << "capacity:" << v.capacity() << endl;
return 0;
}
3、当n小于原本的容量,小于size时,容量不变,代码如下所示:
#include<iostream>
using namespace std;
#include<vector>
int main() {
vector<int> v;
for (int i = 0; i < 20; i++) {
v.push_back(1);
}
cout << "size :" << v.size() << endl;
cout << "capacity:" << v.capacity() << endl;
v.reserve(10);
cout << "size :" << v.size() << endl;
cout << "capacity:" << v.capacity() << endl;
return 0;
}
可以确定的时reserve肯定时不会缩容的。
五、vector的元素获取
5.1 operator[] (重点)
在vector中,也同样重载了[]运算符,我们可以通过[]使用下标来访问元素,代码如下所示:
#include<iostream>
using namespace std;
#include<vector>
int main() {
vector<int> v(10, 1);
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
return 0;
}
5.2 at
at和[]差不多,代码如下所示:
#include<iostream>
using namespace std;
#include<vector>
int main() {
vector<int> v(10, 1);
for (int i = 0; i < v.size(); i++) {
cout << v.at(i) << " ";
}
cout << endl;
return 0;
}
5.3 back
back是取vector的尾元素
5.4 front
front是取vector的首元素。
六、vector的增删查改
6.1 push_back(重点)
push_back是往vector末尾插入一个元素,代码如下:
#include<iostream>
using namespace std;
#include<vector>
int main() {
vector<int> v;
for (int i = 0; i < 10; i++) {
v.push_back(1);
}
for (int i = 0; i < 10; i++) {
cout << v[i] << " ";
}
return 0;
}
6.2 pop_back
push_back是在vector末尾删除一个元素。
6.3 insert
insert函数原型如下:

vector不像string类一样,能支持下标插入,在vector中,它只支持迭代器插入。但是我们可以间接的使用下标插入,将迭代器加上下标就可以在该位置插入了。
它可以在这个位置插入一个值,也可以插入多个值,也可以在这个位置插入一个迭代器区间的内容。
我们在insert之后,pos就失效了,不要直接访问,要访问就要更新这个失效的迭代器的值。
在vs编译器会进行强制的pos检查。如果插入,无论扩容没有,都不能使用这个pos,访问就会报错。
insert函数的返回值是插入元素的迭代器。
6.4 erase
erase的函数原型如下:

可以删除迭代器位置的元素,也可以删除迭代器区间的元素。
和insert一样,我们在执行erase函数之后,这个迭代器就失效了,不允许再次使用这个迭代器,使用就要更新。erase函数的返回是删除元素的下一个元素的迭代器。
6.5 swap
这个函数是交换两个vector容器。
6.6 clear
将vector的size设置为0,容量不变,
2386

被折叠的 条评论
为什么被折叠?



