STL —— vector(1)

图片名称

博主首页: 有趣的中国人

专栏首页: C++专栏


    本篇文章主要讲解vector使用的相关内容

    1. vector简介

    vector 是 C++ 标准库中的一个容器类模板,它提供了动态数组的功能,可以方便地管理和操作元素的集合。下面是关于 vector 的一些基本信息:

    • 头文件: vector 定义在 头文件中,使用时需要包含该头文件。
    • 使用命名空间: vector 类定义在 std 命名空间中,因此需要使用 std::vector 或者在代码开头添加 using namespace std; 来简化使用。
    • 容器特点: vector 是一个序列式容器,它以动态数组的形式存储元素,并提供了在数组末尾快速插入和删除元素的功能。
    • 元素类型: vector 可以存储几乎任何类型的元素,例如整数、浮点数、对象或其他容器,只要这些类型满足一定的要求,例如可移动构造函数和析构函数等。
    • 动态大小: vector 允许动态分配和释放内存,可以根据需要动态调整大小,而无需手动管理内存。
    • 访问元素: 可以使用下标运算符 [] 或者 at() 方法访问 vector 中的元素。
    • 插入和删除: 可以使用 push_back() 方法将元素插入到 vector的末尾,使用 pop_back() 方法删除末尾的元素,还可以使用 insert() 方法在指定位置插入元素,使用 erase() 方法删除指定位置的元素。
    • 动态调整大小: 可以使用 resize() 方法动态调整 vector 的大小,增加或减少元素数量,还可以使用 reserve() 方法预留一定的容量,避免频繁的重新分配内存。
    • 遍历元素: 可以使用迭代器或者基于范围的 for 循环遍历 vector 中的元素。
    • 其他操作: vector 还提供了许多其他有用的方法,例如获取大小、判断是否为空、清空容器、交换容器等。

    vector 是 C++ 中常用的容器之一,它提供了灵活且高效的动态数组功能,适用于各种场景和用途。


      3. vector iterator 的使用

      类似的,vector的迭代器也分为正向和反向,const和非const,即

      • iterator
      • reverse_iterator
      • const_iterator
      • const_reverse_iterator

      1. iterator 示例
      void vector_test2()
      {vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;it = v.begin();// 可修改while (it != v.end()){++*it;++it;}it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;}
      
      1. reverse_iterator 示例
      void vector_test3()
      {vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);vector<int>::reverse_iterator it = v.rbegin();while (it != v.rend()){cout << *it << " ";++it;}cout << endl;it = v.rbegin();while (it != v.rend()){++*it;++it;}it = v.rbegin();while (it != v.rend()){cout << *it << " ";++it;}cout << endl;
      }
      
      1. const_iterator 示例
      void vector_test4()
      {const vector<int> v(10,10);vector<int>::const_iterator it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;// 不可修改/*it = v.begin();while (it != v.end()){++*it;++it;}*/
      }
      
      1. const_reverse_iterator 示例
      void vector_test5()
      {const vector<int> v(10, 66);vector<int>::const_reverse_iterator it = v.rbegin();while (it != v.rend()){cout << *it << " ";++it;}cout << endl;
      }
      

        3. vector 容量操作

        3.1 vector 空间增长问题

        对于 vector 的容量操作,重点有以下几个:

        • size
        • capacity
        • empty
        • resize


        可以用以下代码查看 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';}}
        }
        


        vs下使用的STL基本是按照1.5倍方式扩容。

        3.2 reserve 提前预留空间

        我们知道频繁扩容会对效率大大提高,因此当我们知道需要使用多少空间的时候,应当提前预留空间,用 reserve 函数即可。

        void TestVectorExpand()
        {size_t sz;vector<int> v;sz = v.capacity();v.reserve(100); // 提前将容量设置好,可以避免一遍插入一遍扩容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';}}
        }
        

        3.3 size()、capacity()、resize()

        void vector_test6()
        {vector<int> v(100, 66);cout << v.size() << endl;cout << v.capacity() << endl;// 不会缩容v.resize(50);cout << v.capacity() << endl;// 按照内存对齐的方式给空间v.resize(120);cout << v.size() << endl;cout << v.capacity() << endl;
        }
        

          4.vector 的增删改查


          注意这里的insert() 有三种重载形式,而且在算法库

          iterator insert(iterator pos, const T& value);
          iterator insert(iterator pos, size_type count, const T& value);
          iterator insert(iterator pos, InputIterator first, InputIterator last);

          • pos 是插入的位置,类型为迭代器,表示插入元素的位置。
          • value 是要插入的元素值。
          • count 是要插入的元素个数。
          • first 和 last 是迭代器范围,表示要插入的元素序列的起始和结束位置。
          void vector_test7()
          {vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);for (auto e : v){cout << e << " ";}cout << endl;//vector<int>::iterator pos = find(v.begin(), v.end(), 3);auto pos = find(v.begin(), v.end(), 3);if (pos != v.end()){v.insert(pos, 30);}// 头插v.insert(v.begin(), 0);for (auto e : v){cout << e << " ";}cout << endl;v.insert(v.begin() + 2, 0);for (auto e : v){cout << e << " ";}cout << endl;string s("abcd");v.insert(v.begin(), s.begin(), s.end());for (auto e : v){cout << e << " ";}cout << endl;
          }
          

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

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

          相关文章

          基于单片机智能家居控制系统设计

          **单片机设计介绍&#xff0c;基于单片机智能家居控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能家居控制系统设计旨在实现家居设备的自动化控制和智能化管理&#xff0c;提高家庭生活的便利性和舒…

          大数据做「AI大模型」数据清洗调优基础篇

          关于本文 近期一直在协助做AI大模型数据清洗调优的工作&#xff0c;主要就是使用大数据计算引擎Spark做一些原始数据的清洗工作&#xff0c;整体数据量大约6PB-8PB之间&#xff0c;那么对于整个大数据量的处理性能将是一个重大的挑战&#xff0c;关于具体的调优参数配置项暂时不…

          【论文阅读+复现】AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animation

          AniPortrait&#xff1a;音频驱动的逼真肖像动画合成。 code&#xff1a;Zejun-Yang/AniPortrait: AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animation (github.com) paper&#xff1a;[2403.17694] AniPortrait: Audio-Driven Synthesis of Photoreal…

          Soot入门学习笔记

          Soot 适合参考的文档和教程如下&#xff1a; 北京大学软件分析技术 南京大学软件分析 Tutorials for soot McGill University 198:515 (vt.edu) 比较好的笔记资料&#xff1a; 南京大学《软件分析》课程笔记 比较好的入门作业或者案例&#xff1a; CSCE710 Assignmen…

          产品说明书二维码生成的优势:数字化时代的智能选择

          随着二维码技术的不断发展&#xff0c;越来越多的企业开始选择使用二维码来展示产品使用说明&#xff0c;以取代传统的纸质说明书。这一趋势不仅符合数字化时代的潮流&#xff0c;更为消费者提供了更便捷、更智能的产品使用体验。以下是产品说明书二维码生成的优势&#xff1a;…

          C#_泛型_委托

          文章目录 泛型泛型的使用泛型的约束委托委托的实例化多播委托委托的调用内置委托类型委托练习泛型委托Lambda表达式(进阶)上期习题答案本期习题 泛型 泛型&#xff08;Generic&#xff09; 是一种规范&#xff0c;它允许我们使用占位符来定义类和方法&#xff0c;编译器会在编…

          Linux进程概念(下)

          1. 进程的状态 为了弄明白正在运行的进程是什么意思&#xff0c;我们需要知道进程的不同状态。一个进程可以有几个状态&#xff08;在Linux内核里&#xff0c;进程有时候也叫做任务&#xff09;。 下面的状态在kernel源代码里定义&#xff1a; /* * The task state array is…

          数对 离散化BIT

          先把公式变个形&#xff0c;然后直接BIT 枚举右端点查询左端点累加答案 离散化好题&#xff0c;注意BIT写的时候右端点的范围是离散化区间的大小 #include<bits/stdc.h> using namespace std; #define int long long using ll long long; using pii pair<int,int&…

          国内好用的chatGPT和AI绘图工具

          分享一个比较好用的AI 分享一个比较好用的AI&#xff0c;只是需要开通会员&#xff0c;目前官网的价格是&#xff1a;298&#xff0c;开通之后可以使用chatgpt4、AI绘画、图片融合等等&#xff01;不开通的话是可以免费使用15次的&#xff0c;下面是一些介绍图片&#xff01;链…

          UE5数字孪生系列笔记(三)

          C创建Pawn类玩家 创建一个GameMode蓝图用来加载我们自定义的游戏Mode新建一个Pawn的C&#xff0c;MyCharacter类作为玩家&#xff0c;新建一个相机组件与相机臂组件&#xff0c;box组件作为根组件 // Fill out your copyright notice in the Description page of Project Set…

          Solidity Uniswap V2 Router swapTokensForExactTokens

          最初的router合约实现了许多不同的交换方式。我们不会实现所有的方式&#xff0c;但我想向大家展示如何实现倒置交换&#xff1a;用未知量的输入Token交换精确量的输出代币。这是一个有趣的用例&#xff0c;可能并不常用&#xff0c;但仍有可能实现。 GitHub - XuHugo/solidit…

          Golang实战:深入hash/crc64标准库的应用与技巧

          Golang实战&#xff1a;深入hash/crc64标准库的应用与技巧 引言hash/crc64简介基本原理核心功能 环境准备安装Golang创建一个新的Golang项目引入hash/crc64包测试环境配置 hash/crc64的基本使用计算字符串的CRC64校验和计算文件的CRC64校验和 高级技巧与应用数据流和分块处理网…

          Jmeter 配置说明之线程组

          一、线程组介绍&#xff1a; 线程组元件是任何一个测试计划的开始点。在一个测试计划中的所有元件都必须在某个线程组下。所有的任务都是基于线程组&#xff1a; 通俗理解&#xff1a; 线程组&#xff1a;就是一个线程组&#xff0c;里面有若干个请求&#xff1b; 线程&am…

          vue3.0 + ts + eslint报错:error Parsing error: ‘>‘ expected

          eslint报错 这里加上对应的 eslint配置即可&#xff1a; parser: vue-eslint-parser, parserOptions: {parser: "typescript-eslint/parser",ecmaVersion: 2020,sourceType: module, }具体如下&#xff1a; module.exports {parser: vue-eslint-parser,parserOpti…

          ​马来语翻译中文去哪比较好?

          据了解&#xff0c;马来语是马来西亚、文莱的官方语言&#xff0c;也是新加坡的官方语言之一&#xff0c;马来语跟印尼语是同一种语言&#xff0c;它在整个东南亚有着极大的影响力。如今在国内市场上&#xff0c;马来语翻译的需求也是供不应求&#xff0c;那么&#xff0c;如何…

          【Go】三、Go指针

          文章目录 1、指针2、说明 1、指针 &符号变量 就可以获取这个变量内存的地址*int 是一个指针类型 &#xff08;可以理解为 指向int类型的指针&#xff09; package main import("fmt" ) func main(){var age int 18//&符号变量 就可以获取这个变量内存的地…

          第十五章 Nginx

          一、Nginx 1.1 Nginx 相关概念 1.1.1 正向代理 正向代理类似一个跳板机&#xff0c;代理访问外部资源。 比如我们国内访问谷歌&#xff0c;直接访问访问不到&#xff0c;我们可以通过一个正向代理服务器&#xff0c;请求发到代理服&#xff0c;代理服务器能够访问谷歌&am…

          TBSI模型论文解读及代码分析

          前往我的主页以获得更好的阅读体验 简介 论文来源: Bridging Search Region Interaction With Template for RGB-T Tracking 现有的搜索算法通常会直接连接 RGB 和 T 模态搜索区域, 该方法存在大量冗余背景噪声. 而另一些方法从搜索帧中采样候选框, 对孤立的 RGB 框和 T 框进…

          TongWeb7.0-8.0Java代码使用JMX获取应用通道端口

          以下通过java代码实现获取TongWeb7.0/8.0应用通道端口使用到的JMX均为TongWeb自带的JMX功能。 一、TongWeb7.0 1、使用本地JMX获取应用通道端口 public String getTw7PortByLocalJmx() { try { MBeanServer beanServer ManagementFactory.getPlatformMBeanServer(); Set&l…

          SOLIDWORKS二次开发参数化设计软件 慧德敏学

          SOLIDWORKS参数化设计软件-SolidKits.AutoWorks专为规格变化多、变化规律强的产品开发&#xff0c;将变化规律集成到三维设计软件&#xff0c;通过一键点击实现自动化产品再设计&#xff0c;如智能选型、自动化修改产品属性、产品参数、产品状态、图纸更新、重命名、并自动打包…