C++常用标准库

2023-05-16

STL是Standard Template Library的简称,中文名标准模板库。
从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。STL现在是C++的一部分,因此不用安装额外的库文件。
在C++标准中,STL被组织为下面的17个头文件:
、、、、、、、<forward_list>、、<unordered_map>、、、、、<unordered_set>、和。
一、vector

  1. vector的自我介绍
    vector是向量的意思,可以理解为“可变长度的数组”。
    就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
    相当于一个动态数组,在你不知道需要的数组有多大时可以使用它来节省很多空间。在ACM中常常会出现内存溢出(out of memory)的问题导致WA(wrong answer),而使用vector就能节省很多内存。
    使用vector要在程序开头加上#include来包含需要的头文件,还有加上“using namespace std;”,这样就可以在代码中使用vector了。
    2.vector的定义
    定义一个vector:
    vector vectorname;
    这个定义相当于定义了一个一维的数组vectorname[SIZE],只不过这个SIZE的长度是可以改变的,随着你“加入”进去数的个数而改变。所谓“可变长度的数组”。
    和一维的数组一样,这里的typename可以是任何的类型,如int,double,char,string,long long ,也可以是结构体,甚至是STL的容器如vector,set,queue,stack等。注意!如果typename也是一个容器的话,比如vector<vector > vectorname,要在两个’<‘符号之间加上一个空格,否则编译时会误以为是位移操作。
    3.vector的创建
    vector vec1; // 创建一个空的double向量vector vec(66); // 创建一个初始大小为66的int向量vector vec2(vec1); // 创建一个double型的vec2,并用vec1去初始化vec2vector vec(10,‘k’); // 创建一个含有10个char型数据的vector,并全部初始化为’k’vector vec(10,1);//创建一个初始大小为10的并且值都是1的vectorvector vec2(vec1.begin(),vec1.begin()+3);//用向量vec1的第0个到第2个值初始化vec2int arr[5] = {1, 2, 3, 4, 5};vector vec(arr, arr + 5); //将arr数组的元素用于初始化vec向量,末尾指针指向结束元素//的下一个vector vec(&arr[1], &arr[4]); //将arr[1]~arr[4]范围内的元素作为vec的初始值,不包含arr[4],//原因如上
    4.特别的,元素为vector的vector数组
    (其实就是vector的二维数组)和vector数组! 如果typename是vector,那么就这么定义vector<vector > vectorname; 注意在相邻的’>'之间要加空格。 这个就像二维数组的定义,其中一维是一个元素是vector的vector数组。可以把vector数组 当作两个维长度都可变的二维数组理解。vector数组的定义vector Arrayname[arraySize]; 比如,vector vec[66]; 这样Arrayname[0]~Arrayname[arraySize-1]中每一个都是vector容器。 而vector<vector > vectorname不同的地方时,前者的第一维长度已经固定为arraySize了, 后者却是两个维度都可变长的数组。哈哈哈,用你的大脑,发挥空间想象能力,出现了什么图形? 很神奇是不是!
    5.vector容器内元素的访问形式
    vector一般有两种访问形式:通过下标访问或者是通过迭代器访问。
    (1)通过下标访问
    和访问普通数组是一样的,一个已经定义的vector vec的vector容器,直接访问vec[index]就可以了(比如 vec[0],vec[1])。需要注意的一点是,首先这个vec得有size!!!桥黑板!什么意思呢?就是如果一开始你定义了 比如vector vec1;直接使用vec[0]是不对的!因为里面还没有长度啊!开始用的时候我就经常犯这个错误(尴尬) 。所以可以通过下标访问的范围是从0~vec.size()-1.
    (2)通过迭代器访问
    啥叫迭代器啊?好可怕~就理解为指针吧,不去考虑细节,两者是一样的(包括在java中最近遇见的引用,这简直是三胞胎!)。 定义如下: vector::iterator it;(it就是变量名,一般默认都写成it) 这样it就是一个vector::iterator 型的变量了(hhh,这个名字好长啊),其中,typename就是定义vector时 写的类型。比如: vector::iterator it; vector vec; vector::iterator it2; it2=vec.begin();(或者合成一条:vector::iterator it2=vec.begin(); ) 这样就得到了迭代器it(or it2),并且可以通过it来访问vector里的元素。
    vector vec;vector::iterator it;for (it = vec.begin(); it != vec.end(); it++)//vector的迭代器不支持it<vec.end()写法,因此循环中只能用it!=end()cout << it << endl;//或者vector::iterator it=vec.begin();for(int i=0;i<vec.size();i++){printf("%d ",(it+i));//桥黑板!!在STL容器中,只有vector和string这两个好基友,才允许使用vev.begin()+3这种迭代器加上整//数的写法,只有这俩。//从这里可以看出,vec[i]和
    (vec.begin()+i)是等价的
    }//或者for (size_t i = 0; i < vec.size(); i++) {cout << vec.at(i) << endl;//见下文分解
    }
    好了,终于说完访问形式了,可以介绍基本操作啦!
    6.vector的基本操作
    (1)对容量的操作
    得到向量的大小: vec.size();
    得到向量最大可以是多大: vec.max_size();
    重新设置容器size的大小: vec.resize(num);
    重新设置容器capacity的大小: vec.reserve(num);
    向量真实大小: vec.capacity();
    判断向量是否为空: vec.empty();
    注:关于resize()和reverse(),我觉得记住一点就行了,容器调用resize()函数后, 所有的空间都已经初始化了,所以可以直接访问。比如: vector vet; vec.resize(100); vec[0]=1;//合法语句! 而reserve()函数预分配出的空间没有被初始化,所以不可访问。 推荐一个关于resize()和reserve()写的不错的博客vector中resize()和reserve()区别
    (2)修改元素
    多个元素赋值: vec.assign(); //类似于初始化时用数组进行赋值
    末尾添加元素: vec.push_back(i)//在末尾添加元素i
    末尾删除元素: vec.pop_back();
    任意位置插入元素: vec.insert(it,x);
    1.用来向vector的任意迭代器(见上文)it处插入一个元素x,时间复杂度O(N);
    任意位置删除元素: vec.erase();
    1.erease(it)即删除迭代器为it处的元素;
    2.erase(first,last)即删除[first,last)内的所有元素;(老美的左闭右开,你懂的)
    交换两个向量的元素: vec.swap();//不多讲,用的真的很少。同样,推荐博客vector利用swap()函数进行内存的释放
    (3)惊现迭代器
    开始指针:vec.begin();末尾指针:vec.end(); //指向最后一个元素的下一个位置指向常量的开始指针: vec.cbegin(); //意思就是不能通过这个指针来修改所指的内容,但还是可以通过其他方式修改的,而且指针也是可以移动的。(用的很少,不妨先忽略吧)指向常量的末尾指针: vec.cend();(同上,不多说)
    (4)元素的访问
    下标访问: vec[1]; //桥黑板!!并不会检查是否越界at方法访问: vec.at(1); //以上两者的区别就是at会检查是否越界,是则抛出out of range异常访问第一个元素: vec.front();访问最后一个元素: vec.back();返回一个指针: int* p = vec.data(); //可行的原因在于vector在内存中就是一个连续存储的数组,所以可以返回一个指针指向这个数组。这是是C++11的特性。(可忽略)
    (5)一些算法
    遍历元素
    Cvector::iterator it; for (it = vec.begin();it != vec.end(); it++)
    cout << *it << endl;//或者for (size_t i = 0; i < vec.size(); i++) {
    cout << vec.at(i) << endl;
    }
    元素翻转
    C#include
    reverse(vec.begin(), vec.end());
    元素排序
    C#include
    sort(vec.begin(), vec.end()); //采用的是从小到大的排序 //如果想从大到小排序,可以采用上面反转函数,也可以采用下面方法: bool Comp(const int& a, const int& b) {//固定套路,要加上const,意思是不能修改引用 return a > b;
    }
    sort(vec.begin(), vec.end(), Comp);
    7.vector的用武之地
    (1)储存数据
    vector本身可以作为数组使用,而且在一些元素个数不确定的场合可以很好的节省空间。
    有些场合需要根据一些条件把部分数据输出在同一行,数据中间用空格隔开。由于输出的数据个数是不确定的,为了跟方便的处理最后一个满足条件的数据后面不输出额外的空格,可以先用vector记录所有需要输出的数据,然后一次性输出。
    有强大的方法可以调用(妈呀,java学多了,请不要喷我,暂且就叫方法吧,介绍如上vector的基本操作(1)~(4))
    ( 2 )用邻接表存储图
    使用vector实现邻接表可以有效避免指针,而且更容易把握。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++常用标准库 的相关文章

  • 关于ubuntu18系统~/.bashrc文件中ros环境无法生效问题

    项目场景 xff1a ubuntu18 43 melodic 问题描述 xff1a 这几天一直遇到一个问题 xff0c 就是ubuntu18中ros的环境问题 xff0c 最开始的时候是一直用到好好的ros系统 xff0c 突然说无法识别r
  • 关于move_base无法加载的问题[move_base-11] process has died

    项目场景 xff1a kinetic下使用move base进行导航 问题描述 xff1a 之前move base使用的好好的 xff0c 结果突然之间不能用了 xff0c 出现move base功能包无法加载的情况 报错如下 xff1a
  • Jetson Nano利用普通引脚进行PWM波输出

    这篇博客我就简单介绍一下好了 xff0c 不深入讲了 需要注意的是 xff0c 我这里用到了ROS xff0c 所以运行之前需要安装ROS 初始化中有一个12和50 xff0c 分别代表频率 xff0c 完之后他就会让pin12自动输出50
  • Git基础 - git tag 一文真正的搞懂git标签的使用

    1 什么是tag 1 1 tag的简单理解 tag 中文我们可以称它为 标签 简单的理解 xff0c tag 就是 对某次 commit 的一个标识 xff0c 相当于起了一个别名 例如 xff0c 在项目发布某个版本的时候 xff0c 针
  • C++学习笔记十六:使用OpenCv(c++)调用yolo模型实现目标检测

    一 前言 因为之前都是直接使用python编程来实现目标检测 xff0c 而且是直接使用模型 于是就想了解一下使用c 43 43 语言如何进行目标检测 xff0c 也能帮助自己更好的熟悉c 43 43 的语法 简单起见 xff0c 使用op
  • requests python

    requests是模拟客户端向服务端发送http请求的模块 可以方便的对网页进行爬取 xff0c 是学习python爬虫的较好的http请求模块 1 安装 pip install requests 2 使用方法 方法解释requests r
  • QGraphicsView加入到布局,所在的窗口变大,视图和场景都变大,使场景中的矩形也变大

    需求 窗口变化时 xff0c 窗口中的矩形框也变化 效果展示 当窗口变大时其矩形框也变大 要求绿色矩形框与蓝色背景的边距始终为10 代码 直接上项目的代码 项目结构 各文件的代码 main cpp span class token macr
  • TX2通过串口或CAN和其他设备通信(一)--- 串口通信

    TX2通过串口或CAN和其他设备通信 xff08 一 xff09 串口通信 背景介绍 Jetson TX2是NVIDIA推出的一款嵌入式开发平台 xff0c TX2所提供的性能为早前版本的两倍 xff0c 即能够以两倍以上的功效运行 xff
  • Micropython——九轴传感器(MPU6050)的使用及算法(二)

    前言 xff1a 在上篇文章中 xff0c 简单地实现了九轴传感器 xff08 MPU6050 xff09 的获取加速度 角速度以及温度的数值 但是 xff0c 我们知道 xff0c 对于MPU6050来说 xff0c 其提供的数据会夹杂有
  • Micropython——九轴传感器(MPU6050)的使用及算法(三)

    简介 xff1a 上篇文章中 xff0c 关于九轴传感器 xff08 MPU6050 xff09 xff0c 学习其如何对其生成的数据偏移进行校准 xff0c 这节课我们来将其中的一个问题来进行解决 关于MPU6050地址问题 xff0c
  • C语言库函数——string.h

    目录 摘要 xff1a 一 头文件 string h 中定义的函数 strcpy 用法 xff1a 代码示例 xff1a 参数 xff1a memchr 用法 xff1a 代码示例 xff1a 参数 xff1a strlen 用法 xff1
  • 2019年电赛准备程序STM32版本

    现在是2019年8月11号 xff0c 昨天电赛结束 xff0c 不愿意好的东西随时间而消失不见 xff0c 所以将准备的程序总结一下 xff0c 分享出来 目录 一 电赛的故事 二 准备程序 1 PID 2 滤波 3 菜单 4 直流编码电
  • IDEA格式化js代码

    1 在IDEA Settings Keymap 里面 xff0c 搜索关键字 format code 2 找到格式化代码的快捷键 xff1a Ctrl 43 Alt 43 L 注意这里是大写的L 3 打开需要格式化的js代码 xff0c 输
  • 多旋翼飞行器设计之减震系统的重要性

    减震系统是多旋翼飞行器设计中非常重要的环节 xff0c 好的减震系统可以很好地减轻数字滤波的负担 xff0c 同时能极大地提升控制系统的性能 xff1b 下面针对整个减震系统做一个简要分析 xff1b 首先 xff0c IMU 43 减震海
  • Arduino接收航模遥控器RC接收机的PWM数据

    本文将介绍如何使用Arduino读取RC接收机的PWM数据 1 硬件部分 我的设备 xff1a 接收机 遥控器发射机 将Arduino Nano的引脚 D8 D11 接到接收机的1 4通道 xff0c 接收机上的电源正极和负极连接到Ardu
  • 数据库安全关键技术之数据库脱敏技术详解

    数据库脱敏是一种采用专门的脱敏算法对敏感数据进行变形 屏蔽 替换 随机化 加密 xff0c 并将敏感数据转化为虚构数据的技术 按照作用位置 实现原理不同 xff0c 数据脱敏可以划分为静态数据脱敏 xff08 Static Data Mas
  • qt使用样式表设置窗口widget无边框的情况下为圆角

    提要 窗口widget是无法直接通过样式表设置为圆角的 xff0c 需要在窗口QWidget中拖入控件QFrame xff0c 将QFrame设置的和窗口QWidget一样大小 xff0c 将窗口QWidget中需要的控件拖入到QFrame
  • 【VSCode】启动VSCode时终端自动执行cmd命令,解放双手!

    34 terminal integrated defaultProfile windows 34 34 Command Prompt 34 34 terminal integrated profiles windows 34 34 Powe
  • GPIO寄存器的地址怎么寻找?

    由上图知 xff0c GPIOC的地址就是在这个PERIPH BASE地址的基础上偏移得到得 我们可以一步一步的计算一下GPIOC的地址是多少 0x40000000 43 0x10000 43 0x1000 61 61 0x4001 100
  • Arduino 定时器中断 外部中断

    中断 Interrupt 中断 Interrupt 是计算机的一个重要概念 现代计算机普遍采用中断技术 什么是中断呢 CPU执行时原本是按照程序指令一条一条向下执行的 但如果此时发生了某一件事件B请求CPU迅速去处理 中断发生 CPU暂时中

随机推荐