vector 的使用详解
目录
构造函数
析构函数
拷贝构造
赋值重载( operator = ( ) )
迭代器( begin( ) 和 end( ) )
范围 for
size ( ) 和 capacity ( )
reserve ( )
resize ( )
运算符重载 operator [ ] ( ) 与 at ( )
push_back ( )
pop_back ( )
insert ( )
erase ( )
swap ( )
clear ( )
front ( ) 和 back ( )
比较大小相关函数
完整代码
vector 是STL中的动态数组容器。可以存储任意类型的数据,包括内置类型和自定义。与 string 类不同,vector 要支持各种类型,所以 vector 要实现成模板,用于支持各种类型。
其使用的方式是:
vector<类型名>
构造函数
其支持带参构造,不带参构造,以及迭代器版本等。
void VectorTest()
{//无参构造,其默认初始化为0vector<int> v1;//带参构造,其用 n 个 val 值初始化vector<int> v2(10, 1);// 用迭代器进行构造vector<int> v3(v2.begin() + 1, v2.end() - 1);
}
析构函数
析构函数不需要我们显示调用,其会自动调用。
拷贝构造
void VectorTest()
{//无参构造,其默认初始化为0vector<int> v1;//带参构造,其用 n 个 val 值初始化vector<int> v2(10, 1);// 用迭代器进行构造vector<int> v3(v2.begin() + 1, v2.end() - 1);// 拷贝构造vector<int> v4(v3);
}
赋值重载( operator = ( ) )
void VectorTest()
{//无参构造,其默认初始化为0vector<int> v1;//带参构造,其用 n 个 val 值初始化vector<int> v2(10, 1);// 用迭代器进行构造vector<int> v3(v2.begin() + 1, v2.end() - 1);// 拷贝构造vector<int> v4(v3);// 赋值重载v4 = v2;
}
迭代器( begin( ) 和 end( ) )
begin() 返回开始位置的地址,end() 返回结束位置的下一个位置。
void VectorTest()
{//无参构造,其默认初始化为0vector<int> v1;//带参构造,其用 n 个 val 值初始化vector<int> v2(10, 1);// 用迭代器进行构造vector<int> v3(v2.begin() + 1, v2.end() - 1);// 拷贝构造vector<int> v4(v3);// 赋值重载v4 = v2;// 迭代器vector<int>::iterator it = v4.begin();while (it != v4.end()){cout << *it << ' ';it++;}cout << endl;
}
还有反向迭代器、const迭代器等,使用方法类似。
范围 for
范围 for 的底层为迭代器。
void VectorTest()
{//无参构造,其默认初始化为0vector<int> v1;//带参构造,其用 n 个 val 值初始化vector<int> v2(10, 1);// 用迭代器进行构造vector<int> v3(v2.begin() + 1, v2.end() - 1);// 拷贝构造vector<int> v4(v3);// 赋值重载v4 = v2;// 迭代器vector<int>::iterator it = v4.begin();while (it != v4.end()){cout << *it << ' ';it++;}cout << endl;// 范围forfor (auto i : v4){cout << i << ' ';}cout << endl;
}
size ( ) 和 capacity ( )
取动态数组的长度和当前动态数组所开辟空间的大小。
void VectorTest()
{//无参构造,其默认初始化为0vector<int> v1;//带参构造,其用 n 个 val 值初始化vector<int> v2(10, 1);// 用迭代器进行构造vector<int> v3(v2.begin() + 1, v2.end() - 1);// 拷贝构造vector<int> v4(v3);// 赋值重载v4 = v2;// 迭代器vector<int>::iterator it = v4.begin();while (it != v4.end()){cout << *it << ' ';it++;}cout << endl;// 范围forfor (auto i : v4){cout << i << ' ';}cout << endl;cout << v4.size() << ' ' << v4.capacity() << endl;
}
reserve ( )
用于预先开辟一块可以存储 n 个数据的空间。其会改变容量的大小。但如果 n 小于当前容量大小时,是否会缩容要看编译器的实现。
void VectorTest()
{//无参构造,其默认初始化为0vector<int> v1;//带参构造,其用 n 个 val 值初始化vector<int> v2(10, 1);// 用迭代器进行构造vector<int> v3(v2.begin() + 1, v2.end() - 1);// 拷贝构造vector<int> v4(v3);// 赋值重载v4 = v2;// 迭代器vector<int>::iterator it = v4.begin();while (it != v4.end()){cout << *it << ' ';it++;}cout << endl;// 范围forfor (auto i : v4){cout << i << ' ';}cout << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.reserve(66);cout << v4.size() << ' ' << v4.capacity() << endl;
}
resize ( )
用于调整数组的大小使其变为 n ,会改变数组的 size ,如果 n 大于当前数组长度,其会向后追加 n - size 个值为 val 的数,其默认为 0 ,如果 n 小于当前数组长度,其会将长度缩减为 n 。
void VectorTest()
{//无参构造,其默认初始化为0vector<int> v1;//带参构造,其用 n 个 val 值初始化vector<int> v2(10, 1);// 用迭代器进行构造vector<int> v3(v2.begin() + 1, v2.end() - 1);// 拷贝构造vector<int> v4(v3);// 赋值重载v4 = v2;// 迭代器vector<int>::iterator it = v4.begin();while (it != v4.end()){cout << *it << ' ';it++;}cout << endl;// 范围forfor (auto i : v4){cout << i << ' ';}cout << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.reserve(66);cout << v4.size() << ' ' << v4.capacity() << endl;//将长度调整为20,此时size = 10,所以追加 20-10 个值为 6 的数//未指定要追加的值,则默认为0v4.resize(20, 6);cout << v4.size() << ' ' << v4.capacity() << endl;//要将长度调整为6v4.resize(6);cout << v4.size() << ' ' << v4.capacity() << endl;
}
运算符重载 operator [ ] ( ) 与 at ( )
直接使用下标访问某个位置的元素,不同的是如果访问下标不存在,operator [ ]会断言报错,而 at 会抛出异常。
void VectorTest()
{//无参构造,其默认初始化为0vector<int> v1;//带参构造,其用 n 个 val 值初始化vector<int> v2(10, 1);// 用迭代器进行构造vector<int> v3(v2.begin() + 1, v2.end() - 1);// 拷贝构造vector<int> v4(v3);cout << v4.size() << ' ' << v4.capacity() << endl;// 赋值重载v4 = v2;// 迭代器vector<int>::iterator it = v4.begin();while (it != v4.end()){cout << *it << ' ';it++;}cout << endl;// 范围forfor (auto i : v4){cout << i << ' ';}cout << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.reserve(66);cout << v4.size() << ' ' << v4.capacity() << endl;//将长度调整为20,此时size = 10,所以追加 20-10 个值为 6 的数//未指定要追加的值,则默认为0v4.resize(20, 6);cout << v4.size() << ' ' << v4.capacity() << endl;//要将长度调整为6v4.resize(6);cout << v4.size() << ' ' << v4.capacity() << endl;cout << v4[5] << endl;v4[5] = 5;cout << v4[5] << endl;
}
push_back ( )
向数组尾部插入一个值为 val 的元素,若空间不够其会自动扩容。
void VectorTest()
{//无参构造,其默认初始化为0vector<int> v1;//带参构造,其用 n 个 val 值初始化vector<int> v2(10, 1);// 用迭代器进行构造vector<int> v3(v2.begin() + 1, v2.end() - 1);// 拷贝构造vector<int> v4(v3);cout << v4.size() << ' ' << v4.capacity() << endl;// 赋值重载v4 = v2;// 迭代器vector<int>::iterator it = v4.begin();while (it != v4.end()){cout << *it << ' ';it++;}cout << endl;// 范围forfor (auto i : v4){cout << i << ' ';}cout << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.reserve(66);cout << v4.size() << ' ' << v4.capacity() << endl;//将长度调整为20,此时size = 10,所以追加 20-10 个值为 6 的数//未指定要追加的值,则默认为0v4.resize(20, 6);cout << v4.size() << ' ' << v4.capacity() << endl;//要将长度调整为6v4.resize(6);cout << v4.size() << ' ' << v4.capacity() << endl;cout << v4[5] << endl;v4[5] = 5;cout << v4[5] << endl;v4.push_back(9);v4.push_back(9);v4.push_back(9);v4.push_back(9);cout << v4.size() << ' ' << v4.capacity() << endl;
}
pop_back ( )
删除数组的最后一个元素。
void VectorTest()
{//无参构造,其默认初始化为0vector<int> v1;//带参构造,其用 n 个 val 值初始化vector<int> v2(10, 1);// 用迭代器进行构造vector<int> v3(v2.begin() + 1, v2.end() - 1);// 拷贝构造vector<int> v4(v3);cout << v4.size() << ' ' << v4.capacity() << endl;// 赋值重载v4 = v2;// 迭代器vector<int>::iterator it = v4.begin();while (it != v4.end()){cout << *it << ' ';it++;}cout << endl;// 范围forfor (auto i : v4){cout << i << ' ';}cout << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.reserve(66);cout << v4.size() << ' ' << v4.capacity() << endl;//将长度调整为20,此时size = 10,所以追加 20-10 个值为 6 的数//未指定要追加的值,则默认为0v4.resize(20, 6);cout << v4.size() << ' ' << v4.capacity() << endl;//要将长度调整为6v4.resize(6);cout << v4.size() << ' ' << v4.capacity() << endl;cout << v4[5] << endl;v4[5] = 5;cout << v4[5] << endl;v4.push_back(9);v4.push_back(9);v4.push_back(9);v4.push_back(9);cout << v4.size() << ' ' << v4.capacity() << endl;v4.pop_back();cout << v4.size() << ' ' << v4.capacity() << endl;
}
insert ( )
向数组指定位置之前插入元素。但不同的是其指定位置时,使用的是迭代器。
void VectorTest()
{//无参构造,其默认初始化为0vector<int> v1;//带参构造,其用 n 个 val 值初始化vector<int> v2(10, 1);// 用迭代器进行构造vector<int> v3(v2.begin() + 1, v2.end() - 1);// 拷贝构造vector<int> v4(v3);cout << v4.size() << ' ' << v4.capacity() << endl;// 赋值重载v4 = v2;// 迭代器vector<int>::iterator it = v4.begin();while (it != v4.end()){cout << *it << ' ';it++;}cout << endl;// 范围forfor (auto i : v4){cout << i << ' ';}cout << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.reserve(66);cout << v4.size() << ' ' << v4.capacity() << endl;//将长度调整为20,此时size = 10,所以追加 20-10 个值为 6 的数//未指定要追加的值,则默认为0v4.resize(20, 6);cout << v4.size() << ' ' << v4.capacity() << endl;//要将长度调整为6v4.resize(6);cout << v4.size() << ' ' << v4.capacity() << endl;cout << v4[5] << endl;v4[5] = 5;cout << v4[5] << endl;v4.push_back(9);v4.push_back(9);v4.push_back(9);v4.push_back(9);cout << v4.size() << ' ' << v4.capacity() << endl;v4.pop_back();cout << v4.size() << ' ' << v4.capacity() << endl;//在第三个位置之前插入数据v4.insert(v4.begin() + 3, 7);cout << v4.size() << ' ' << v4.capacity() << endl;
}
erase ( )
用于删除指定数据,或指定的一段区间。
void VectorTest()
{//无参构造,其默认初始化为0vector<int> v1;//带参构造,其用 n 个 val 值初始化vector<int> v2(10, 1);// 用迭代器进行构造vector<int> v3(v2.begin() + 1, v2.end() - 1);// 拷贝构造vector<int> v4(v3);cout << v4.size() << ' ' << v4.capacity() << endl;// 赋值重载v4 = v2;// 迭代器vector<int>::iterator it = v4.begin();while (it != v4.end()){cout << *it << ' ';it++;}cout << endl;// 范围forfor (auto i : v4){cout << i << ' ';}cout << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.reserve(66);cout << v4.size() << ' ' << v4.capacity() << endl;//将长度调整为20,此时size = 10,所以追加 20-10 个值为 6 的数//未指定要追加的值,则默认为0v4.resize(20, 6);cout << v4.size() << ' ' << v4.capacity() << endl;//要将长度调整为6v4.resize(6);cout << v4.size() << ' ' << v4.capacity() << endl;cout << v4[5] << endl;v4[5] = 5;cout << v4[5] << endl;v4.push_back(9);v4.push_back(9);v4.push_back(9);v4.push_back(9);cout << v4.size() << ' ' << v4.capacity() << endl;v4.pop_back();cout << v4.size() << ' ' << v4.capacity() << endl;//在第三个位置之前插入数据v4.insert(v4.begin() + 3, 7);cout << v4.size() << ' ' << v4.capacity() << endl;v4.erase(v4.begin() + 3);cout << v4.size() << ' ' << v4.capacity() << endl;
}
swap ( )
用于交换两个数组。
void VectorTest()
{//无参构造,其默认初始化为0vector<int> v1;//带参构造,其用 n 个 val 值初始化vector<int> v2(10, 1);// 用迭代器进行构造vector<int> v3(v2.begin() + 1, v2.end() - 1);// 拷贝构造vector<int> v4(v3);cout << v4.size() << ' ' << v4.capacity() << endl;// 赋值重载v4 = v2;// 迭代器vector<int>::iterator it = v4.begin();while (it != v4.end()){cout << *it << ' ';it++;}cout << endl;// 范围forfor (auto i : v4){cout << i << ' ';}cout << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.reserve(66);cout << v4.size() << ' ' << v4.capacity() << endl;//将长度调整为20,此时size = 10,所以追加 20-10 个值为 6 的数//未指定要追加的值,则默认为0v4.resize(20, 6);cout << v4.size() << ' ' << v4.capacity() << endl;//要将长度调整为6v4.resize(6);cout << v4.size() << ' ' << v4.capacity() << endl;cout << v4[5] << endl;v4[5] = 5;cout << v4[5] << endl;v4.push_back(9);v4.push_back(9);v4.push_back(9);v4.push_back(9);cout << v4.size() << ' ' << v4.capacity() << endl;v4.pop_back();cout << v4.size() << ' ' << v4.capacity() << endl;//在第三个位置之前插入数据v4.insert(v4.begin() + 3, 7);cout << v4.size() << ' ' << v4.capacity() << endl;v4.erase(v4.begin() + 3);cout << v4.size() << ' ' << v4.capacity() << endl;cout << v3.size() << ' ' << v3.capacity() << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.swap(v3);cout << v3.size() << ' ' << v3.capacity() << endl;cout << v4.size() << ' ' << v4.capacity() << endl;
}
clear ( )
清除所有数据,即 size 为 0 ,但容量不变。
void VectorTest()
{//无参构造,其默认初始化为0vector<int> v1;//带参构造,其用 n 个 val 值初始化vector<int> v2(10, 1);// 用迭代器进行构造vector<int> v3(v2.begin() + 1, v2.end() - 1);// 拷贝构造vector<int> v4(v3);cout << v4.size() << ' ' << v4.capacity() << endl;// 赋值重载v4 = v2;// 迭代器vector<int>::iterator it = v4.begin();while (it != v4.end()){cout << *it << ' ';it++;}cout << endl;// 范围forfor (auto i : v4){cout << i << ' ';}cout << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.reserve(66);cout << v4.size() << ' ' << v4.capacity() << endl;//将长度调整为20,此时size = 10,所以追加 20-10 个值为 6 的数//未指定要追加的值,则默认为0v4.resize(20, 6);cout << v4.size() << ' ' << v4.capacity() << endl;//要将长度调整为6v4.resize(6);cout << v4.size() << ' ' << v4.capacity() << endl;cout << v4[5] << endl;v4[5] = 5;cout << v4[5] << endl;v4.push_back(9);v4.push_back(9);v4.push_back(9);v4.push_back(9);cout << v4.size() << ' ' << v4.capacity() << endl;v4.pop_back();cout << v4.size() << ' ' << v4.capacity() << endl;//在第三个位置之前插入数据v4.insert(v4.begin() + 3, 7);cout << v4.size() << ' ' << v4.capacity() << endl;v4.erase(v4.begin() + 3);cout << v4.size() << ' ' << v4.capacity() << endl;cout << v3.size() << ' ' << v3.capacity() << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.swap(v3);cout << v3.size() << ' ' << v3.capacity() << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.clear();cout << v4.size() << ' ' << v4.capacity() << endl;
}
front ( ) 和 back ( )
用于获取第一个和最后一个元素。
void VectorTest()
{//无参构造,其默认初始化为0vector<int> v1;//带参构造,其用 n 个 val 值初始化vector<int> v2(10, 1);// 用迭代器进行构造vector<int> v3(v2.begin() + 1, v2.end() - 1);// 拷贝构造vector<int> v4(v3);cout << v4.size() << ' ' << v4.capacity() << endl;// 赋值重载v4 = v2;// 迭代器vector<int>::iterator it = v4.begin();while (it != v4.end()){cout << *it << ' ';it++;}cout << endl;// 范围forfor (auto i : v4){cout << i << ' ';}cout << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.reserve(66);cout << v4.size() << ' ' << v4.capacity() << endl;//将长度调整为20,此时size = 10,所以追加 20-10 个值为 6 的数//未指定要追加的值,则默认为0v4.resize(20, 6);cout << v4.size() << ' ' << v4.capacity() << endl;//要将长度调整为6v4.resize(6);cout << v4.size() << ' ' << v4.capacity() << endl;cout << v4[5] << endl;v4[5] = 5;cout << v4[5] << endl;v4.push_back(9);v4.push_back(9);v4.push_back(9);v4.push_back(9);cout << v4.size() << ' ' << v4.capacity() << endl;v4.pop_back();cout << v4.size() << ' ' << v4.capacity() << endl;//在第三个位置之前插入数据v4.insert(v4.begin() + 3, 7);cout << v4.size() << ' ' << v4.capacity() << endl;v4.erase(v4.begin() + 3);cout << v4.size() << ' ' << v4.capacity() << endl;cout << v3.size() << ' ' << v3.capacity() << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.swap(v3);cout << v3.size() << ' ' << v3.capacity() << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.clear();cout << v4.size() << ' ' << v4.capacity() << endl;cout << v3.front() << ' ' << v3.back() << endl;
}
比较大小相关函数
vector 中提供了一系列比较大小
完整代码
#include<iostream>
#include<vector>
using namespace std;void VectorTest()
{//无参构造,其默认初始化为0vector<int> v1;//带参构造,其用 n 个 val 值初始化vector<int> v2(10, 1);// 用迭代器进行构造vector<int> v3(v2.begin() + 1, v2.end() - 1);// 拷贝构造vector<int> v4(v3);cout << v4.size() << ' ' << v4.capacity() << endl;// 赋值重载v4 = v2;// 迭代器vector<int>::iterator it = v4.begin();while (it != v4.end()){cout << *it << ' ';it++;}cout << endl;// 范围forfor (auto i : v4){cout << i << ' ';}cout << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.reserve(66);cout << v4.size() << ' ' << v4.capacity() << endl;//将长度调整为20,此时size = 10,所以追加 20-10 个值为 6 的数//未指定要追加的值,则默认为0v4.resize(20, 6);cout << v4.size() << ' ' << v4.capacity() << endl;//要将长度调整为6v4.resize(6);cout << v4.size() << ' ' << v4.capacity() << endl;cout << v4[5] << endl;v4[5] = 5;cout << v4[5] << endl;v4.push_back(9);v4.push_back(9);v4.push_back(9);v4.push_back(9);cout << v4.size() << ' ' << v4.capacity() << endl;v4.pop_back();cout << v4.size() << ' ' << v4.capacity() << endl;//在第三个位置之前插入数据v4.insert(v4.begin() + 3, 7);cout << v4.size() << ' ' << v4.capacity() << endl;v4.erase(v4.begin() + 3);cout << v4.size() << ' ' << v4.capacity() << endl;cout << v3.size() << ' ' << v3.capacity() << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.swap(v3);cout << v3.size() << ' ' << v3.capacity() << endl;cout << v4.size() << ' ' << v4.capacity() << endl;v4.clear();cout << v4.size() << ' ' << v4.capacity() << endl;cout << v3.front() << ' ' << v3.back() << endl;
}int main()
{VectorTest();return 0;
}