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

C++ vector基本操作

目录

一、介绍

二、定义

三、迭代器

四、容量操作

1、size

2、capacity

3、empty

4、resize

5、reserve

总结(扩容机制)

五、增删查改

1、push_back & pop_back

2、find

3、insert

4、erase

5、swap

6、operator[]


一、介绍

vector的文档介绍

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

vector的使用

vector学习时一定要学会查看文档:vector的文档介绍,vector在实际中非常的重要,在实际中我们熟悉常见的接口就可以。

二、定义

这些是C++标准库中`vector`类的构造函数的不同重载形式。下面是对每个构造函数的解释:

1. 无参构造函数:`vector()` 

vector<int> v;
  • 创建一个空的`vector`对象,不包含任何元素。

2. 构造并初始化n个val:`vector(size_type n, const value_type& val = value_type())`

vector<int> v1(10, 1);
  • 创建一个包含`n`个元素的`vector`对象,每个元素都初始化为`val`。
  • 可以选择提供一个初始值`val`,如果未提供,则使用默认值类型的默认构造函数进行初始化。

3. 使用迭代器进行初始化构造 :`vector(InputIterator first, InputIterator last)`

string s1("hello");
vector<char> v3(s1.begin(), s1.end());
  • 创建一个`vector`对象,并使用范围 `[first, last)` 内的元素进行初始化。
  • `first` 和 `last` 是迭代器,指定了要复制的元素范围。
  • 这个构造函数允许使用迭代器来指定要复制的元素范围,可以是数组、容器或其他可迭代对象。

4. 拷贝构造函数:`vector(const vector& x)` 重点

vector<int>v1(v);
  • 创建一个新的`vector`对象,其元素与另一个`vector`对象`x`相同。
  • 拷贝构造函数用于创建一个副本,新的`vector`对象将独立于原始对象,对其中一个对象的修改不会影响另一个对象。

举例演示一下,其中输出和string类一样,有三种方式:范围for [ ] 迭代器。

void test1()
{//无参构造vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);//三种输出方式 范围for [] 迭代器for (auto a : v){cout << a << " ";}cout << endl;for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;//vector<int>::iterator it = v.begin();auto it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;//拷贝构造vector<int> copy(v);for (auto a : copy) {cout << a << " ";}cout << endl;
}
void test2()
{//构造并初始化vector<int> v1(6, 6);for (auto a : v1){cout << a << " ";}cout << endl;//迭代器vector<int> v2(v1.begin(), v1.end());for (auto b : v2){cout << b << " ";}cout << endl;string s1("hello");vector<char> v3(s1.begin(), s1.end());for (auto b : v3){cout << b << " ";}}
int main()
{test1();cout << endl;test2();return 0;
}

三、迭代器

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

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

通过使用这些接口,可以在vector中进行迭代操作。

  • 例如,使用begin()end()可以遍历vector中的元素,而使用rbegin()rend()可以反向遍历vector中的元素。
  • 请注意,对于只读的vector,应使用const_iteratorconst_reverse_iterator来确保不修改vector的元素。
void test3()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);//正向迭代器vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;//反向迭代器vector<int>::reverse_iterator rit = v.rbegin();while (rit != v.rend()){cout << *rit << " ";++rit;}
}
int main()
{test3();return 0;
}

四、容量操作

1、size

获取数据个数。
int main() {std::vector<int> v = {1, 2, 3, 4, 5};std::cout << "Size of vector: " << v.size() << std::endl;return 0;
}

2、capacity

capacity获取容量大小。
int main() {std::vector<int> v;std::cout << "Initial capacity: " << v.capacity() << std::endl;for (int i = 0; i < 10; i++) {v.push_back(i);std::cout << "Capacity after pushing " << i << ": " << v.capacity() << std::endl;}return 0;
}

3、empty

判断是否为空。
int main() {std::vector<int> v;std::cout << "Is vector empty? " << (v.empty() ? "Yes" : "No") << std::endl;v.push_back(1);std::cout << "Is vector empty? " << (v.empty() ? "Yes" : "No") << std::endl;return 0;
}

4、resize

改变vector的size。
void resize (size_type n, value_type val = value_type());
  1. 调整容器的大小,使其包含 n 个元素。
  2. 如果 n 小于当前容器大小,则内容将减少到其前 n 个元素,删除超出的元素(并销毁它们)。
  3. 如果 n 大于当前容器大小,则通过在末尾插入任意数量的元素来扩展内容,以达到 n 的大小。如果指定了 val,则新元素将初始化为 val 的副本,否则,它们将初始化值。
  4. 如果 n 也大于当前容器容量,则会自动重新分配分配的存储空间。
  5. 请注意,此函数通过插入或擦除容器中的元素来更改容器的实际内容。
int main() {std::vector<int> v = {1, 2, 3, 4, 5};v.resize(7, 100);for (int i : v) {std::cout << i << " ";}std::cout << std::endl;v.resize(3);for (int i : v) {std::cout << i << " ";}return 0;
}

5、reserve

改变vector的capacity。
reserve(): 这个方法更改vector的capacity。如果新的capacity大于当前的capacity,那么vector的内存将被重新分配以适应更多的元素。如果新的capacity小于当前的capacity,那么这个方法不会有任何效果。
int main() {std::vector<int> v;std::cout << "Initial capacity: " << v.capacity() << std::endl;v.reserve(10);std::cout << "Capacity after reserving: " << v.capacity() << std::endl;return 0;
}

总结(扩容机制)

  • capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的
  • 这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。
  • reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。
  • resize在开空间的同时还会进行初始化,影响size。

通过下面代码可以观察到vector的默认扩容机制。

void TestVectorExpand()
{size_t sz;vector<int> v;sz = v.capacity();cout << "making v grow:\n";for (int i = 0; i < 100; ++i){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "capacity changed: " << sz << '\n';}}
}

如果已经确定vector中要存储元素大概个数,可以提前将空间设置足够就可以避免边插入边扩容导致效率低下的问题了。

void TestVectorExpandOP()
{vector<int> v;size_t sz = v.capacity();v.reserve(100); // 提前将容量设置好,可以避免一遍插入一遍扩容cout << "making bar grow:\n";for (int i = 0; i < 100; ++i){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "capacity changed: " << sz << '\n';}}
}

五、增删查改

1、push_back & pop_back

尾插&尾删
int main() {std::vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);for (int i : v) {std::cout << i << " ";}cout << endl;v.pop_back();for (int i : v) {std::cout << i << " ";}return 0;
}

2、find

  • 查找 find函数是一个算法模块中的函数,用于在vector中查找特定的元素。
  • 它需要提供要查找的元素的起始和结束位置,并返回一个指向该元素的迭代器。
  • 例如,如果有一个vector v,可以使用std::find(v.begin(), v.end(), 5)在v中查找整数5。

3、insert

  • 插入 insert函数用于在指定位置之前插入一个元素。它需要提供要插入的位置和要插入的值作为参数。
  • 例如,如果有一个vector v,可以使用v.insert(v.begin() + 2, 10)在v的第三个位置插入整数10。

4、erase

  • 删除 erase函数用于删除指定位置的元素。它需要提供要删除的位置作为参数,并返回一个指向被删除元素之后位置的迭代器。
  • 例如,如果有一个vector v,可以使用v.erase(v.begin() + 3)删除v的第四个元素。

下面这段代码演示了对vector进行插入、查找和删除操作的示例。

void test5()
{vector<int> v;v.push_back(1); // 在vector末尾插入元素1v.push_back(2); // 在vector末尾插入元素2v.push_back(3); // 在vector末尾插入元素3v.push_back(4); // 在vector末尾插入元素4for (auto e : v){cout << e << " "; // 输出vector中的每个元素}cout << endl;// 在vector中查找值为2的元素vector<int>::iterator pos = find(v.begin(), v.end(), 2); if (pos != v.end()){v.insert(pos, 20); // 在找到的位置之前插入元素20}for (auto e : v){cout << e << " "; // 输出修改后的vector中的每个元素}cout << endl;pos = find(v.begin(), v.end(), 2); // 再次查找值为2的元素if (pos != v.end()){v.erase(pos); // 删除找到的元素}for (auto e : v){cout << e << " "; // 输出修改后的vector中的每个元素}cout << endl;v.erase(v.begin()); // 删除vector的第一个元素for (auto e : v){cout << e << " "; // 输出修改后的vector中的每个元素}cout << endl;
}int main()
{test5();return 0;
}

5、swap

  • 交换 swap函数用于交换两个vector的数据空间。它需要提供另一个vector作为参数,并将当前vector的内容与参数vector的内容进行交换。
  • 例如,如果有两个vector v1和v2,可以使用v1.swap(v2)交换它们的内容。
int main() {std::vector<int> v1 = { 1, 2, 3 };std::vector<int> v2 = { 4, 5, 6 };v1.swap(v2);for (int i : v1) {cout << i << " ";}cout << endl;for (int i : v2) {cout << i << " ";}return 0;
}

6、operator[]

像数组一样访问

int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);for (size_t i = 0; i < v.size(); ++i){cout << v[i] << " ";}return 0;
}

相关文章:

C++ vector基本操作

目录 一、介绍 二、定义 三、迭代器 四、容量操作 1、size 2、capacity 3、empty 4、resize 5、reserve 总结&#xff08;扩容机制&#xff09; 五、增删查改 1、push_back & pop_back 2、find 3、insert 4、erase 5、swap 6、operator[] 一、介绍 vector…...

使用SLS日志服务采集Kong网关的日志

一、阿里云SLS 官方的接入文档已比较丰富了&#xff0c;本文不意重复说明此事。 站在使用的角度&#xff0c;以采集Kong的日志为示例&#xff0c;说明我们应该如何治理日志。 说白了&#xff0c;本文是想给你怎么省钱作一个建议&#xff0c;希望不会让你公司也“降本增笑”。…...

TA-Lib学习研究笔记(九)——Pattern Recognition (1)

TA-Lib学习研究笔记&#xff08;九&#xff09;——Pattern Recognition &#xff08;1&#xff09; 0.程序代码 形态识别的函数的应用&#xff0c;通过使用A股实际的数据&#xff0c;验证形态识别函数&#xff0c;用K线显示出现标志的形态走势&#xff0c;由于入口参数基本上…...

基于GAN的多尺度门合并多模态MRI图像合成

Multi-Modal MRI Image Synthesis via GAN With Multi-Scale Gate Mergence 基于GAN的多尺度门合并多模态MRI图像合成背景贡献实验方法生成器gate mergence (GM) strategy&#xff08;门控融合策略&#xff09;判别器 损失函数Thinking 基于GAN的多尺度门合并多模态MRI图像合成…...

浅谈https

1.网络传输的安全性 http 协议&#xff1a;不安全&#xff0c;未加密https 协议&#xff1a;安全&#xff0c;对请求报文和响应报文做加密 2.对称加密与非对称加密 2.1 对称加密 特点&#xff1a; 加解密使用 相同 秘钥 高效&#xff0c;适用于大量数据的加密场景 算法公开&a…...

计算两个结构的差

平面上有6个点&#xff0c;以6a1的方式运动 1 1 1 1 - - - 1 - - - 1 现在有一个点逃逸&#xff0c;剩下的5个点将如何运动&#xff1f; 2 2 2 3 - - - 3 - - - 3 将6a1的6个点减去1个点&#xff0c;只有两种可能&#xff0c;或者变成5a2&#xff0c…...

class037 二叉树高频题目-下-不含树型dp【算法】

class037 二叉树高频题目-下-不含树型dp【算法】 code1 236. 二叉树的最近公共祖先 // 普通二叉树上寻找两个节点的最近公共祖先 // 测试链接 : https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/ package class037;// 普通二叉树上寻找两个节点的最近…...

使用cpolar完成内网穿刺

cpolar官网上有一句评论&#xff1a;cpolar是用过最简单的内网穿刺工具&#xff01; 实际体验下来&#xff0c;cpolar确实是能够非常简单地实现内网穿刺 先说弊端&#xff0c;免费版的cpolar提供的穿刺地址&#xff0c;有效期为一天&#xff0c;进程连接数有限&#xff0c;如…...

git的使用:基础配置和命令行

前言 代码管理工具,任何开发都离不开的话题。 到了任何公司,第一件事肯定是配置个人的电脑。主要就是三点,配置对应的开发环境,配置各类开发工具和配置git等代码管理工具拉取代码。 这篇文章主要是git的配置和最常用(我指的是最常用)的命令行使用 git基础配置 git的安装 …...

若依微服务项目整合rocketMq

原文链接&#xff1a;ttps://mp.weixin.qq.com/s/IYdo_suKvvReqCiEKjCeHw 第一步下载若依项目 第二步安装rocketMq&#xff08;推荐在linux使用docker部署比较快&#xff09; 第二步新建一个生产者模块儿&#xff0c;再建一个消费者模块 第四步在getway模块中配置接口映射规…...

连接服务器的ssh终端自动断开解放方法

在Linux中&#xff0c;SSH连接在一段时间内没有活动时可能会自动断开&#xff0c;这是为了安全性考虑的一种默认行为&#xff0c;以防止未经授权的访问。这个时间限制通常由SSH服务器的配置决定。你可以通过以下几种方式来处理这个问题&#xff1a; 1.使用SSH配置文件&#xf…...

Windows+WSL开发环境下微服务注册(Consul)指定IP

Win11下安装一个WSL2&#xff0c;做开发环境&#xff0c;简直是爽到不要不要的&#xff0c;相当于既有Windows下的完善生态&#xff0c;又有linux的便利。特别是&#xff0c;在linux下运行的服务端口号&#xff0c;完全和windows是相通的&#xff0c;直接在windows下浏览访问&a…...

通过K8S安装人大金仓数据库

1. 离线下载镜像&#xff0c;请点击 2. 官网下载镜像 https://www.kingbase.com.cn/xzzx/index.htm&#xff0c;根据自己的需求下载对应版本。 3. K8S需要的yaml清单 cat > kingbase.yaml << EOF apiVersion: apps/v1 kind: Deployment metadata:name: kingbase-…...

正则表达式(3):入门

正则表达式&#xff08;3&#xff09;&#xff1a;入门 小结 本博文转载自 从这篇文章开始&#xff0c;我们将介绍怎样在Linux中使用”正则表达式”&#xff0c;如果你想要学习怎样在Linux中使用正则表达式&#xff0c;这些文章就是你所需要的。 在认识”正则表达式”之前&am…...

《系统架构设计师教程(第2版)》第2章-计算机系统基础知识-01-计算机硬件

文章目录 1. 计算机系统概述2. 计算机硬件2.1 处理器(CPU)2.2 存储器2.2.1 概述2.2.2 按硬件结构分类2.2.3 按与处理器距离分2.3 总线(Bus)2.3.1 概念2.3.2 分类2.3.3 串行总线和并行总线2.4 接口2.4.1 概念2.4.2 常见接口2.5 外部设备1. 计算机系统概述 #mermaid-svg-IcU0sR…...

用友NC word.docx接口存在任意文件读取漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、产品介绍 用友 NC Cloud&#xff0c;大型企业数字化平台&#xff…...

【离散数学】——期末刷题题库(等价关系与划分)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…...

IDEA maven无法下载源代码处理

1、使用idea内置maven 在idea中新增一个mvn运行项,截图如下: 输入命令: dependency:resolve -Dclassifiersources 2、如果外部maven&#xff0c;不使用idea内部maven 在工程目录下命令行执行命令: mvn dependency:resolve -Dclassifiersources...

基于B/S架构的医院一体化电子病历编辑器源码

电子病历在线制作、管理和使用的一体化电子病历解决方案&#xff0c;通过一体化的设计&#xff0c;提供对住院病人的电子病历书写、保存、修改、打印等功能。电子病历系统将临床医护需要的诊疗资料以符合临床思维的方法展示。建立以病人为中心&#xff0c;以临床诊疗信息为主线…...

免费百度SEO优化工具,百度SEO优化排名工具

百度SEO关键词工具 让我们聚焦在百度SEO关键词工具上。对于任何想要在百度搜索引擎中脱颖而出的网站管理员而言&#xff0c;深入了解用户搜索习惯和关键词的选择是至关重要的。 百度SEO关键词工具不仅提供了免费的服务&#xff0c;而且功能强大。通过输入相关领域的关键词&…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

算法刷题-回溯

今天给大家分享的还是一道关于dfs回溯的问题&#xff0c;对于这类问题大家还是要多刷和总结&#xff0c;总体难度还是偏大。 对于回溯问题有几个关键点&#xff1a; 1.首先对于这类回溯可以节点可以随机选择的问题&#xff0c;要做mian函数中循环调用dfs&#xff08;i&#x…...

比较数据迁移后MySQL数据库和ClickHouse数据仓库中的表

设计一个MySQL数据库和Clickhouse数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...