文章目录
七、vector
1. vector的介绍
学了 string类 后,学习其他容器就非常简单了。
vector 是表示可变大小数组的序列容器。就是高配版数组。用法就是 vector< class T> name 。
2. vector的使用
其实没什么说的,直接上手吧,和 string 差不多。
cpp
#include<iostream>
// 包含头文件
#include<vector>
using namespace std;
int main()
{
// 一个 vector 容器,存储的数据类型是 int ,对象名叫做 v
vector<int> v;
// 尾插
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
// 可以下标 + [] 访问
for (size_t i = 0; i < v.size(); ++i)
{
cout << v[i] << " ";
}
cout << endl;
// 可以使用迭代器访问
vector<int>::iterator it = v.begin();
while (it != v.end())
{
cout << *it << " ";
++it;
}
cout << endl;
// 可以 范围for 访问
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
return 0;
}
还可以这样构造:
cpp
#include<iostream>
#include<vector>
using namespace std;
int main()
{
// 初始化 10个1
vector<int> v(10, 1);
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
return 0;
}
其他的看看文档即可,我们现在来看看 vector 的扩容机制。
cpp
#include<iostream>
#include<vector>
using namespace std;
int main()
{
size_t sz;
vector<int> v;
sz = v.capacity();
// 初始容量
cout << sz << endl;
cout << "making v grow:\n";
for (int i = 0; i < 100; ++i)
{
v.push_back(i);
// 发生扩容
if (sz != v.capacity())
{
sz = v.capacity();
cout << "capacity changed: " << sz << '\n';
}
}
return 0;
}
规律比较好找,就是 扩容1.5倍,向上取整 。在 linux环境下是 2倍扩容 。
cpp
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v;
// 10 个 0
v.resize(10, 0);
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
return 0;
}
resize 可以改变内容
resize 和 reserve 都不能够缩容,有一个接口可以缩容,那就是 shrink_to_fit,它会将 capacity 缩小到 size 大小。
在数据访问操作中:
下标 + [] 访问 是通过断言来处理越界 , 而 at 则是通过抛异常处理越界 。
vector 只有尾插尾删,没有头插头删(可以通过 insert 和 erase 来解决),因为顺序表头插头删效率很低,代价很大。
vector 里并没有 find 函数,但是算法库 < algorithm > 里面有 find 函数模板,使用 find 函数时,包含一下算法库即可。
cpp
#include<iostream>
#include<vector>
// 包含算法库
#include<algorithm>
using namespace std;
int main()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
// find 会在一段区间内 找 value, 找不到时返回 右区间
vector<int>::iterator pos = find(v.begin(), v.end(), 3);
if (pos != v.end())
{
// 在 pos 位置插入 30
v.insert(pos, 30);
}
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
return 0;
}
insert 也可以插入一段迭代器区间 ,即使不是自己的迭代器。
cpp
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
string s = "ABCDE";
v.insert(v.begin(), s.begin(), s.end());
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
return 0;
}
vector 是一个对象数组,不要局限于内置类型,要放开思维。
cpp
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<string> v;
v.push_back("QWERTYUIOP");
// 本质上是匿名对象
v.push_back(string("ASDFGHJKL"));
v.push_back("ZXCVBNM");
for (auto e : v)
{
cout << e << endl;
}
return 0;
}
vector 是个模板,存任意类型都可以,如果 vector 里存的是 vector 类型,则就是二维数组。
cpp
// 二维数组
vector<vector<int>> vv;