1. vector 的构造
vector 需要显式实例化类模版,在创建 vector 类型的容器时可以直接创建,也可以进行初始化,例如 v2 ,也可以使用迭代器的方式创建,具体关于更多vector的知识: vector
//模版类只能显式实例化
vector<int> v1;
vector<int> v2(10, 1);
//迭代器初始化
vector<int> v3(v2.begin(), v2.end());
2. vector 的遍历
vector 与 string 类有着异曲同工之妙,并且做了更多的优化,所以在学习了 string 类之后再来学习 vector 就会简单很多,关于 vector 的遍历也与 string 类很相似,具体介绍可以移步到 面向对象程序设计(C++)之 string 类
2.1 下标遍历
//模版类只能显式实例化
vector<int> v1;
vector<int> v2(10, 1);
//迭代器初始化
vector<int> v3(v2.begin(), v2.end());
//1.下标遍历
for (size_t i = 0; i < v2.size(); i++)
{
cout << v2[i] << " ";
}
cout << endl;
2.2 迭代器遍历
//模版类只能显式实例化
vector<int> v1;
vector<int> v2(10, 1);
//迭代器初始化
vector<int> v3(v2.begin(), v2.end());
//2.迭代器遍历
vector<int>::iterator it = v2.begin();
while (it != v2.end())
{
cout << *it << " ";
it++;
}
cout << endl;
2.3 范围 for 遍历
//模版类只能显式实例化
vector<int> v1;
vector<int> v2(10, 1);
//迭代器初始化
vector<int> v3(v2.begin(), v2.end());
//3.范围 for 遍历
for (auto e : v2)
{
cout << e << " ";
}
cout << endl;
3. vector 的扩容机制
这里借助插入100个数据来判断 vector 的扩容机制,我们由下图可知在 VS 环境下是1.5倍扩容,在 g++ 环境下是2倍扩容,当然我们可以使用 reserve 接口来提前保存一部分空间减少扩容次数,需要注意的是 vector 与 string 不同,string 的 reverse 接口如果给出的值小于原来的容量那么就是一个无约束的,可能会缩容;但是 vector 的 reverse 接口如果给出一个小于原容量的值就不会影响,即不会缩容(VS 与 g++ 环境均不会缩容)
void TestVectorExpend()
{
size_t sz;
vector<int> v;
sz = v.capacity();
cout << "capacity changed :" << sz << "\n";
cout << "make a grow" << endl;
for (size_t i = 0; i < 100; i++)
{
v.push_back(i);
if (sz != v.capacity())
{
sz = v.capacity();
cout << "capacity changed :" << sz << "\n";
}
}
}
VS 环境下扩容
g++环境下扩容
4. vector 的常用接口
4.1 resize 接口
resize 接口是在原来 vector 对象的基础上进行添加数据,当然有两种情况,一种是给定的添加数据容量小于原来的size,就会减小size的值而不改变capacity的值(容量不变);第二种情况就是大于size的值,就会根据给定的值来扩容(这里只讨论VS环境下的情况)
vector<int> v(10, 1);
cout << v.size() << endl;
cout << v.capacity() << endl;
//1.小于size
v.resize(5, 2);
cout << v.size() << endl;
cout << v.capacity() << endl;
//2.大于size
v.resize(15, 2);
cout << v.size() << endl;
cout << v.capacity() << endl;
4.2 push_back 接口
可以进行尾插,通常 vector 支持迭代器插入
vector<int> v(10, 2);
//1.尾插
v.push_back(10);
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
4.3 insert 接口
在指定位置插入数据,通常 vector 支持迭代器插入,但是没有明确的头插,但是使用insert可以进行头插
vector<int> v(10, 2);
//2.头插
v.insert(v.begin(), 1);
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
//3.在第三个位置进行插入
v.insert(v.begin() + 3, 1);
for (auto e : v)
{
cout << e << " ";
}
4.4 erase 接口
删除指定位置的数据或者删除指定区间的数据,没有头删的接口可以使用 erase 接口进行头删
vector<int> v(10, 2);
//4.头删
v.erase(v.begin());
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
//5.删除第三个位置的数据
v.erase(v.begin() + 3);
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
4.5 流插入与流提取
与 string类不同的是 vector 不支持流插入与流提取,但是可以自己设计,更加灵活
vector<int> v(10);
for (size_t i = 0; i < v.size(); i++)
{
cin >> v[i];
}
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
5. vector 的不同类型元素
5.1 vector<int>
存放整数类型
//10个1
vector<int> v1(10, 1);
5.2 vector<char>
存放字符类型
//10个'a'
vector<char> v2(10, 'a');
5.3 vector<vector<int>>
二维数组存放整数类型
//二维数组
vector<int> v(5, 1);//5个元素的一维数组
vector<vector<int>> vv(10, v);//10行5列的二维数组
//使用下标遍历二维数组
for (int i = 0; i < vv.size(); i++)
{
for (int j = 0; j < v.size(); j++)
{
cout << vv[i][j] << " ";
}
cout << endl;
}