C++ STL vector

目录

一.认识vector

二.vector的使用

1.vector的构造函数

2.vector的迭代器

2.1 begin(),end()

2.2 rbegin(),rend()

2.3 迭代器初始化对象

 3. vector 增删查改

3.1push_back(),pop_back()

3.2  insert(),erase()

3.3 operator[]

 4.vector 空间控制

4.1 size(),capacity(),empty()

4.2 resize(),reserve()


一.认识vector

  1. vector是表示可变大小数组的序列容器。
  2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
  3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
  4. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
  5. 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
  6. 与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好。

使用STL的三个境界:能用,明理,能扩展 ,那么下面学习vector,我们也是按照这个方法去学习。

二.vector的使用

vector学习时一定要学会查看文档:vector 使用文档 vector的文档介绍,vector在实际中非常的重要,在实际中我们熟悉常见的接口就可以,下面列出了哪些接口是要重点掌握的。

1.vector的构造函数

 vector支持使用默认构造函数,同时支持模板:

	//<int> 模板类型,存储int的顺序表vector<int> v1;//存储string的顺序表vector<string> v2;//存储double的顺序表vector<double> v3;//存储char的顺序表vector<char> v4;

vector 也支持构造并且初始化:

//构造一个 vector开10个int空间,并全部初始化为2vector<int> v1(10, 2);

支持拷贝构造,使用已经创建的对象初始化新的对象:

	//拷贝构造初始化vector<int> v2(v1);

2.vector的迭代器

vector容器也是可以使用迭代器的。有了迭代器范围for也就可以使用了。

2.1 begin(),end()

begin()获取第一个数据位置的 iterator/const_iteratorend() 获取最后一个数据的下一个位置的iterator/const_iterator。

	//构造一个 vector开10个int空间,并全部初始化为123vector<int> v1(10, 123);//vector 迭代器//auto it =v1.begin();vector<int>::iterator it = v1.begin();while (it != v1.end()){cout << *it << " ";it++;}cout << endl;

 2.2 rbegin(),rend()

rbegin()获取最后一个数据位置的 reverse_iteratorrend()获取第一个数据前一个位置的reverse_iterator

	//构造一个 vector开10个int空间,并全部初始化为123vector<int> v1(10, 123);//vector 反向迭代器//auto rit =v1.rbegin();vector<int>::reverse_iterator rit = v1.rbegin();while (rit != v1.rend()){cout << *rit << " ";rit++;}

2.3 迭代器初始化对象

vector也是支持迭代器区间初始化,而且初始化使用的迭代器区间不仅仅可以是vector的迭代器,也可以是其他容器的迭代器区间,但是要支持数据类型的转换。例如:

	string str("hello C++");vector<int> v1(10,2);vector<int> v2(v1.begin(), v1.end() - 5);//string的迭代器区间初始化vector<int> v3(str.begin(), str.end());for (auto e : v2){cout << e<<" ";}cout << endl;for (auto e : v3){cout << e << " ";}

 3. vector 增删查改

3.1push_back(),pop_back()

push_back()提供可以在vector尾部插入数据的功能。pop_back()提供可以在尾部删除数据的功能。

	vector<int> v1;v1.push_back(10);v1.push_back(20);v1.push_back(30);v1.push_back(40);v1.push_back(50);v1.push_back(60);for (auto e : v1){cout << e << " ";}cout << endl;v1.pop_back();v1.pop_back();for (auto e : v1){cout << e << " ";}

 3.2  insert(),erase()

 insert支持在某一个迭代器位置 position 后进行插入一个val,或者在一个迭代器位置position ,插入 n 个val,也支持使用一段迭代器区间去插入,使用的迭代器区间可以是其他容器的迭代器区间,但是要支持数据类型的转换。

 erase提供了删除某一个迭代器位置的值,或者某一段迭代器区间的值。

vector<int> v1;//尾插 30 40 50 60v1.push_back(30);v1.push_back(40);v1.push_back(50);v1.push_back(60);for (auto e : v1){cout << e << " ";}cout << endl;//在beginw位置之前插入20 10v1.insert(v1.begin(), 20);v1.insert(v1.begin(), 10);for (auto e : v1){cout << e << " ";}cout << endl;//删除尾部的两个数据v1.erase(v1.end()-1);v1.erase(v1.end()-1);for (auto e : v1){cout << e << " ";}

 3.3 operator[]

[ ]运算符的重载,支持 vector 像数组一样访问。

	vector<int> v1;//尾插 30 40 50 60v1.push_back(30);v1.push_back(40);v1.push_back(50);v1.push_back(60);for (int i = 0; i < v1.size(); i++){cout << (v1[i]+=10) << " ";}

 

 4.vector 空间控制

4.1 size(),capacity(),empty()

size(),返回当前vector存储的数据个数。

capacity()返回当前vector的容量。

empty()判断当前容量是否为空。

4.2 resize(),reserve()

resize 修改当前 vector 的有效数据尾个数,可以增加也可以减少。resize 还可以开空间的同时并初始化,如果 resize 的大小比原 vector size 小是不会影响到容量的大小。如果 resize 的大小比原 vector sizevector 会进行扩容。

	vector<int> v1;//尾插 30 40 50 60v1.push_back(30);v1.push_back(40);v1.push_back(50);v1.push_back(60);v1.resize(2);for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}

 resize 开空间并初始化:

	vector<int> v1;//开10个空间,并且全部初始化为 5v1.resize(10, 5);for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}

 reserve可以进行扩充vector的容量,但是并不会初始化开的空间。但是 reserve 并不会缩容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/56543.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小白到运维工程师自学之路 第六十五集 (docker-compose)

一、概述 Docker Compose 的前身是 Fig&#xff0c;它是一个定义及运行多个 Docker 容器的工具。可以使用YAML文件来配置应用程序的服务。然后&#xff0c;使用单个命令&#xff0c;您可以创建并启动配置中的所有服务。Docker Compose 会通过解析容器间的依赖关系&#xff08;…

分布式应用:Zookeeper 集群与kafka 集群部署

目录 一、理论 1.Zookeeper 2.部署 Zookeeper 集群 3.消息队列 4.Kafka 5.部署 kafka 集群 6.FilebeatKafkaELK 二、实验 1.Zookeeper 集群部署 2.kafka集群部署 3.FilebeatKafkaELK 三、问题 1.解压文件异常 2.kafka集群建立失败 3.启动 filebeat报错 4.VIM报错…

使用 React Native CLI 创建项目

React Native 安装的先决条件和设置 需要掌握的知识点 掌握 JavaScript 基础知识掌握 React 相关基础知识掌握 TypeScript 相关基础知识 安装软件前需要首先安装Chocolatey。Chocolatey 是一种流行的 Windows 包管理器。 安装 nodejs 和 JDK choco install -y nodejs-lts …

数据互通,版本管理优化图文档与BOM数据

在现代企业的产品开发过程中&#xff0c;图文档和BOM数据是不可或缺的关键要素。图文档记录了产品的设计和工程信息&#xff0c;而BOM数据则明确了产品所需物料的清单和规格。然而&#xff0c;由于数据的复杂性和版本变更的频繁性&#xff0c;图文档与BOM数据之间的协作和管理常…

JDK下载与安装

一、下载JDK安装包 在JDK官网&#xff08;https://www.oracle.com/java/technologies/downloads/&#xff09;或其他渠道提前下载好JDK安装包。 二、开始安装JDK 1、进入/opt/software目录&#xff08;可自定义&#xff09;&#xff0c;将JDK压缩包上传到该目录下&#xff1a; …

yo!这里是STL::vector类简单模拟实现

目录 前言 重要接口模拟实现 默认成员函数 1.构造函数 2.析构函数 3.拷贝构造函数 4.赋值运算符重载 迭代器 简单接口 1.size() 2.capacity() 3.swap() 操作符重载 1.操作符[] 扩容接口 1.reserve() 2.resize() 增删查改接口 1.push_back() 2.pop_back() …

RabbitMQ的安装

RabbitMQ的安装 1、Windows环境下的RabbitMQ安装步骤 使用的版本&#xff1a;otp_win64_23.2 rabbitmq-server-3.8.16 版本说明&#xff1a;https://www.rabbitmq.com/which-erlang.html#compatibility-matrix 1.1 下载并安装erlang RabbitMQ 服务端代码是使用并发式语言…

java,python,c++有什么区别,python java c c++区别

大家好&#xff0c;给大家分享一下java,python,c有什么区别&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 从这四种语言的难度、受欢迎度还有作用以及优点缺点给楼主做一个全面的分析&#xff0c;我们可以从中了解其区别&#xff0c;以及…

机器学习笔记之优化算法(七)线搜索方法(步长角度;非精确搜索;Wolfe Condition)

机器学习笔记之优化算法——线搜索方法[步长角度&#xff0c;非精确搜索&#xff0c;Wolfe Condition] 引言回顾&#xff1a; Armijo \text{Armijo} Armijo准则及其弊端 Glodstein \text{Glodstein} Glodstein准则及其弊端 Wolfe Condition \text{Wolfe Condition} Wolfe Condi…

Red Hat 安装MySQL 8.0与 Navicat

目录 Red Hat 安装 MySQL 8.0 1、更新软件包列表 2、安装MySQL服务器和客户端 3、启动MySQL服务 4、确保MySQL服务器正在运行 5、root 用户的密码 6、登录MySQL&#xff0c;输入mysql密码 7、MySQL默认位置 Red Hat 安装 Navicat 1、下载 Navicat 2、执行命令 Red H…

【暑期每日一练】 Epilogue

目录 选择题&#xff08;1&#xff09;解析&#xff1a; &#xff08;2&#xff09;解析&#xff1a; &#xff08;3&#xff09;解析&#xff1a; &#xff08;4&#xff09;解析&#xff1a; &#xff08;5&#xff09;解析&#xff1a; 编程题题一描述输入描述&#xff1a;输…

【TypeScript】交叉类型联合类型(四)

【TypeScript】交叉类型&联合类型&#xff08;四&#xff09; 【TypeScript】交叉类型&联合类型&#xff08;四&#xff09;一、简介二、交叉类型2.1 交叉类型使用的注意点2.2 基本数据类型交叉2.3 对象类型交叉 三、联合类型四、类型缩减 一、简介 TypeScript 中的交…