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;提高家庭生活的便利性和舒…

          PyTorch数据结构

          前言&#xff1a;因为最近开始读深度学习代码&#xff0c;主要都是用PyTorch框架&#xff0c;所以来补一些PyTorch基础&#xff0c;先从数据结构入手。 PyTorch数据结构 PyTorchPyTorch数据结构张量属性&#xff1a;维度、轴、形状常见的操作 数据集构造代码DataLoader 模块 参…

          Redis 教程系列之Redis 事务(十六)

          Redis 事务可以一次执行多个命令&#xff0c; 并且带有以下两个重要的保证&#xff1a; 事务是一个单独的隔离操作&#xff1a;事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令请求所打断。事务是一个原子操作&#x…

          2024年03月CCF-GESP编程能力等级认证C++编程八级真题解析

          本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 为丰富食堂菜谱,炒菜部进行头脑风暴。肉类有鸡肉、牛肉、羊肉、猪肉4种,切法有肉排、肉块、肉末3种,配菜有圆白菜、油菜、…

          react useState的初始化函数 初始化值为props时的同步问题 | setState函数的使用与异步更新

          文章目录 react setState函数useState()钩子创建state如何根据props更新state值 setState的参数是下一个状态statesetState的参数是更新函数functionsetState异步与同步合成事件setState 实现原理 react setState函数 useState()钩子创建state const [state, setState] useS…

          大数据做「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…

          MySQL8 中文参考翻译完成

          MySQL8 中文参考前言和法律声明第一章 一般信息1.1 关于本手册1.2 MySQL 数据库管理系统概述1.2.1 什么是 MySQL&#xff1f;1.2.2 MySQL 的主要特性1.2.3 MySQL 的历史1.3 MySQL 8.0 中的新功能1.4 MySQL 8.0 中新增、弃用或删除的服务器和状态变量和选项1.5 如何报告错误或问…

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

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

          Android WebView的使用与后退键处理

          目录 前言首先&#xff0c;我们需要在布局文件中添加webView组件在Activity中获取webView实例&#xff0c;并加载网页内容 前言 webView是Android中常用的组件之一&#xff0c;用于展示网页内容。它可以加载HTML文件、URL链接等网页内容&#xff0c;并提供交互功能。在使用webV…

          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&…

          【ZZULIOJ】1011: 圆柱体表面积(Java)

          目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 输入圆柱体的底面半径r和高h&#xff0c;计算圆柱体的表面积并输出到屏幕上。要求定义圆周率为如下宏常量 #define PI 3.14159 输入 输入两个实数&#xff0c;为圆柱体的底面半径r和高h。 输出 输…

          国内好用的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…

          【python】网络编程socket TCP UDP

          文章目录 socket常用方法TCP客户端服务器UDP客户端服务器网络编程就是实现两台计算机的通信 互联网协议族 即通用标准协议,任何私有网络只要支持这个协议,就可以接入互联网。 socket socke模块的socket()函数 import socketsock = socket.socket(Address Family,

          Solidity Uniswap V2 Router swapTokensForExactTokens

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

          修改Docker Gitlab root 的密码

          一、进入git docker 容器 docker exec -it [容器ID或名称] /bin/bash 二、查找并修改账号 user User.find_by(username: ‘root’) user.password ‘root********’ user.password_confirmation ‘root********’ user.save! 三、重启生效 附&#xff1a;第一次&#xff…