当前位置: 首页 > news >正文

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;
}

http://www.mrgr.cn/news/45361.html

相关文章:

  • 如何使用 vSphere Client 给虚拟机扩容
  • LeetCode-12. 整数转罗马数字【哈希表 数学 字符串】
  • 双向链表基本操作实现--建议做题时画图 切不可死记
  • qiankun(乾坤)解决父子应用样式的影响和策略
  • ②EtherNet/IP转ModbusTCP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关
  • 2024下半年国内EI学术会议有哪些
  • 数据库SQL 某字段按首字母排序_sql按首字母排序
  • unix系统中的system函数
  • Spring Cloud微服务详解
  • EDA脚本应用领域及使用特点
  • 实战千问2大模型第四天——Qwen2-VL-7B(多模态)lora微调训练和测试
  • python画图|显式和隐式接口The explicit and the implicit interfaces
  • can 总线入门———can简介硬件电路
  • Redis面试篇1
  • 也来猜猜 o1 实现方法
  • OpenCV高级图形用户界面(3)关闭由 OpenCV 创建的指定窗口函数destroyWindow()的使用
  • PCL-点云质心识别
  • 机器学习——强化学习与深度强化学习
  • JioNLP:一款实用的中文NLP预处理工具包
  • gligen安装部署笔记