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.rhkb.cn/news/79941.html

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

相关文章

pp-ocr报错记录

RESER 报错&#xff1a; distutils.errors.DistutilsError: Could not find suitable distribution for Requirement.parse(‘tomli>1.0.0’) 解决办法&#xff1a; 参考&#xff1a;https://stackoverflow.com/questions/67603407/distutilserror-could-not-find-suitable…

网络编程——MAC地址、IP地址和子网掩码

MAC地址、IP地址和子网掩码 一、MAC地址&#xff1a;硬件身份证 1、MAC地址的概念 MAC地址&#xff0c;即媒体访问控制地址&#xff08;Media Access Control Address&#xff09;&#xff0c;是一个用于唯一标识网络设备的物理地址。每个网络接口卡&#xff08;NIC&#xf…

RocketMQ 主备自动切换模式部署

目录 主备自动切换模式部署 Controller 部署​ Controller 嵌入 NameServer 部署​ Controller 独立部署​ Broker 部署​ 兼容性​ 升级注意事项​ 主备自动切换模式部署 该文档主要介绍如何部署支持自动主从切换的 RocketMQ 集群&#xff0c;其架构如上图所示&#xff…

TeeChart NET for MAUI Crack

TeeChart NET for MAUI Crack 跨平台图表-移动或桌面应用程序的核心图表代码相同。 图表集合-60多种图表类型和50多种财务和统计指标。 图表类型 60多种2D和3D图表类型以及多种组合&#xff0c;包括&#xff1a; 标准&#xff1a;线条(条形)、条形、区域、饼图、快线、点(散点…

24届近5年上海大学自动化考研院校分析

今天给大家带来的是上海大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、上海大学 学校简介 上海大学是上海市属的综合性研究型大学&#xff0c;是教育部与上海市人民政府共建高校&#xff0c;是国家“211 工程”重点建设高校、上海市高水平地方大学建设高校&a…

Python爬虫遇到重定向问题解决办法汇总

在进行Python爬虫任务时&#xff0c;遇到重定向问题是常见的问题之一。重定向是指在发送请求时&#xff0c;服务器会返回一个新的URL&#xff0c;将请求重新定向到该URL。为了帮助您解决这个问题&#xff0c;本文将提供一些实用的解决办法&#xff0c;并给出相关的代码示例&…

论文阅读 - Social bot detection in the age of ChatGPT: Challenges and opportunities

论文链接&#xff1a;https://www.researchgate.net/publication/371661341_Social_bot_detection_in_the_age_of_ChatGPT_Challenges_and_opportunities 目录 摘要&#xff1a; 引言 1.1. Background on social bots and their role in society 1.2. The rise of AI-gene…

Java私有仓库Nexus搭建部署

Java私有仓库Nexus搭建部署 需求分析 为什么要搭建部署Nexus私有仓库&#xff0c;有什么用&#xff0c;用来干什么&#xff0c;怎么用&#xff0c;也许是大家看到这篇文章的第一个反应和疑惑&#xff0c;这里给大家先笼统的做一个介绍&#xff1a; 依赖管理&#xff1a;在Java…

css, resize 拖拉宽度

效果如下&#xff1a; 可直接复制预览查看属性值: 关键样式属性&#xff1a; resize: horizontal; overflow-x: auto; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content…

Windows同时安装两个版本的JDK并随时切换,以JDK6和JDK8为例,并解决相关存在的问题(亲测有效)

Windows同时安装两个版本的JDK并随时切换&#xff0c;以JDK6和JDK8为例&#xff0c;并解决相关存在的问题&#xff08;亲测有效&#xff09; 1.下载不同版本JDK 这里给出JDK6和JDK的百度网盘地址&#xff0c;具体安装过程&#xff0c;傻瓜式安装即可。 链接&#xff1a;http…

第20节 R语言医学分析:某保险医疗事故赔偿因素分析

文章目录 某保险医疗事故赔偿因素分析源码源文件下载某保险医疗事故赔偿因素分析 我们分析数据集“诉讼”的第一个方法是确定样本数量、变量类型、缩放/编码约定(如果有)用于验证数据清理。 接下来,数据集看起来很干净,没有缺失值,并且对于分类变量,将编码约定替换为实际…

第3章 数据和C

本章介绍以下内容&#xff1a; 关键字&#xff1a;int 、short、long、unsigned、char、float、double、_Bool、_Complex、_Imaginary 运算符&#xff1a;sizeof() 函数&#xff1a;scanf() 整数类型和浮点数类型的区别 如何书写整型和浮点型常数&#xff0c;如何声明这些类型的…

设计模式原来是这样

目录 概述: 什么是模式&#xff01;&#xff01; 为什么学习模式&#xff01;&#xff01; 模式和框架的比较&#xff1a; 设计模式研究的历史 关于pattern的历史 Gang of Four(GoF) 关于”Design”Pattern” 重提&#xff1a;指导模式设计的三个概念 1.重用(reuse)…

工具、技巧【个人专用】如何在CSND编辑器内输出带颜色的字体?Markdown编辑器——字体、字号、颜色使用全解

当你穿过了暴风雨,你就不再是原来那个人。 ————村上春树 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人工智能领域TOP4dz

HarmonyOS/OpenHarmony-ArkTS基于API9元服务开发快速入门

一、创建项目 二、创建卡片 三、添加资源 四、具体代码 Entry Component struct WidgetNewCard {/** The title.*/readonly TITLE: string harmonyOs;readonly CONTEXT: string 技术构建万物智联;/** The action type.*/readonly ACTION_TYPE: string router;/** The…

Win10下webots2020b闪退

下载安装完之后打开软件就会停留在这个界面几秒钟&#xff0c;什么都点不了&#xff0c;然后就会闪退回桌面 原因: webots安装路径中有中文 解决方案&#xff1a; 安装路径下的中文改为英文

【广州华锐视点】海上石油钻井VR在线实训平台

随着科技的不断发展&#xff0c;VR元宇宙平台已经成为了越来越多领域的培训工具。在海上石油钻井实训中&#xff0c;VR元宇宙平台也能够发挥重要的作用&#xff0c;为学员提供更加真实、直观的培训体验。 首先&#xff0c;VR元宇宙平台可以模拟真实的海上钻井作业环境。通过VR眼…

Mybatis分页查询案例

前言 今天再写项目时刚好碰到Mybatis分页查询展示数据&#xff0c;现将实现过程整理出来以便后续再碰到类似需求回来瞅一眼。 数据准备 1、数据库表&#xff08;user_info&#xff09; 2、前端页面 代码实现 1、User实体类 package com.liming.pojo;import com.fasterxml.ja…

帆软设计器报表加载不出折线图的原因

最近在用帆软设计器做可视化图表。偶有遇到因为数据集的字段类型导致加载不出折线&#xff0c;现记录如下。做报表的同行可以参考。 数据库使用了 Oracle 11g。数据集的 SQL 代码片是之前用在另一个单元格报表里面的。页面上有一个率是直接计算得出&#xff0c;我为了方便、就…

python+requests+json 接口测试思路示例

实际项目中用python脚本实现接口测试的步骤&#xff1a; 1 发送请求&#xff0c;获取响应 》》2 提取响应里的数据&#xff0c;对数据进行必要的处理 》》3 断言响应数据是否与预期一致 以豆瓣接口为例&#xff0c;做一个简单的接口测试吧。使用到的知识涉及requests库&…