C++ 之 Vector 和 List
Vector
vector 是C++ STL中最常用的容器,支持存储多种类型的数据。
与数组相比,它的大小是可变的,因此也会被称为动态数组。
使用它,需要包含头文件:
#include <vector>
定义的结构: vector<数据类型> 变量名
#include <vector>vector<int> v1;
vector<double> v2;
vector<string> v3;
vector<int> v4[5]; // 相当于二维数组
vector<double> v5[5];
它的常用函数:
begin()返回头部迭代器end()返回尾部+1迭代器rbegin()返回逆头部迭代器rend()返回逆尾部-1迭代器size()返回容器中元素个数大小resize()改变容器大小,不会改变预分配的容器大小capacity()获取预分配的容量大小resrve获取于分配的空间front()返回第一个元素back()返回最后一个元素push_back()/emplace_back()在容器末尾插入一个元素pop_back()删除最后一个元素empty()检测容器是否为空insert在指定位置插入元素erase在指定位置删除元素clear清空容器所有元素
注意size和capacity:
size对应的是容器的真实大小,对应的方法是
capactiy对应的是容器预分配的容量大小,对应的方法是reserve
#include <iostream>
#include <vector>
using namespace std;int main() {vector<int> vec;// 初始化的时候容器没有对象,也就没有预留内存空间// vec.size() =0 vec.capacity() =0// 预留了空间,但容器没有对象,所以真实空间大小为0vec.reserve(10);// vec.size() =0 vec.capacity() =10// 插入一个元素,真实大小改变vec.push_back(1);//vec.size() =1 vec.capacity() =10// 修改了容器空间的真实大小vec.resize(10);// vec.size() =10 vec.capacity() =10// 末尾插入数据,容器的空间进行了扩展vec.push_back(9);// vec.size() =11 vec.capacity() =20return 0;
}
基本使用:
#include <iostream>
#include <vector>
using namespace std;int main() {// 插入数据vector<int> vec;for(int i = 0; i < 4; ++i) {vec.push_back(i);}cout << "迭代器遍历" << endl;for(vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++) {cout << *iter << endl;}cout << "下标遍历" << endl;for(int i = 0; i < vec.size(); ++i) {cout << vec[i] << endl;}cout << "foreach遍历,不支持逆序" << endl;for(int value:vec) {cout << value << endl;}return 0;
}
List
底层为双向链表,内容空间不连续,只能通过指针访问。插入删除数据快,但是随机访问速度慢。
多适用于对数据进行频繁插入和删除的环境中。
list的iterator是不支持+、- 、< 等操作的, 但支持使用sort对元素排序
#include <iostream>
#include <list>using namespace std;int main() {std::list<int> myList;// 插入元素for(int i = 0; i < 10; ++i) {if (i < 5) {// 列表末尾插入元素myList.push_back(i);} else {// 列表前端插入元素myList.push_front(i);}}// 排序元素, 默认从小到大myList.sort();// 对元素进行反序myList.reverse();// 遍历元素for(list<int>::iterator iter = myList.begin(); iter != myList.end(); ++iter) {cout << *iter << endl;} return 0;
}
vector和list相比较:vector随机访问快,但是插入删除慢,list反之
比较
vector的优点:
- 使用连续的存储空间,访问速度快
- 支持随机访问,通过
[]和at方法访问数据,推荐后者,可避免越界问题 - 可以拓展容器大小
- 可以快速的在尾部插入和删除,及通过
push_back和pop_back方法
vector的缺点:
- 内部插入删除操作效率低,不如列表好用
- 针对于数据只能在尾部进行push或pop
- 添加数据超过预先分配大小,拓展容器大小会为原来的两倍,然后再拷贝数据
关于vector、array、数组相关
- 数组是不安全的,访问时容易越界; vector和array可以通过
at避免越界的问题 - vector属于可变容器,但array和数组属于定长容器
- 数组获取大小需要通过
sizeof()/strlen()来遍历计数获取大小,但vector和array可通过size()和Empty()来获取大小和是否为空 - 数组交换元素只能通过遍历的方式逐个交换,但vector和array通过
swap()即可 - vector的数据存储在堆中,array的数据存储在栈中
相关文章:
C++ 之 Vector 和 List
Vector vector 是C STL中最常用的容器,支持存储多种类型的数据。 与数组相比,它的大小是可变的,因此也会被称为动态数组。 使用它,需要包含头文件: #include <vector>定义的结构: vector<数据类…...
力扣-448.找到所有数组中消失的数字
Idea 模拟 class Solution { public:vector<int> findDisappearedNumbers(vector<int>& nums) {int n nums.size();vector<int> a(n 1, 0);for(int i : nums) a[i];vector<int> ans;for(int i 1; i < n; i) if(!a[i]) ans.emplace_back(i);r…...
常用gdb调试命令
常见gdb调试命令 命令名 命令缩写 命令说明 backtrace bt 查看函数调用堆栈 frame f 查看栈帧 list l 查看源码 print p 打印内部变量值 info i 查看程序状态 display disp 跟踪某变量,每次停下来则显示值 run r 开始运行程序 continue c 继续程序运行,直到下一个断…...
【动手学深度学习-Pytorch版】BERT预测系列——用于预测的BERT数据集
本小节的主要任务即是将wiki数据集转成BERT输入序列,具体的任务包括: 读取wiki数据集生成下一句预测任务的数据—>主要用于_get_nsp_data_from_paragraph函数从输入paragraph生成用于下一句预测的训练样本:_get_nsp_data_from_paragraph生…...
【数据结构-字符串 三】【栈的应用】字符串解码
废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【字符串转换】,使用【字符串】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…...
Stm32_标准库_10_TIM_显示时间日期
利用TIM计数耗费1s,启动中断,秒表加一 时间显示代码: #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h"uint16_t num 0; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; NVIC_I…...
10-SRCNN-使用CNN实现超分辨成像
文章目录 utils_dataset.pymodel.pytrain.pyuse.py主要文件 utils_dataset.py 工具文件,主要用来制作dataset,便于加入dataloader,用于实现数据集的加载和并行读取 model.py 主要写入网络(模型) train.py 主要用于训练 use.py 加载训练好的模型,用于测试或使用 utils_dat…...
cmd/bat 输出符,控制台日志输出到文件
前言 略 输出符 A > B将A执行结果覆盖写入B A >> B将A执行结果追加写入B 常用句柄 句柄句柄的数字代号描述STDIN0键盘输入STDOUT1输出到命令提示符窗口STDERR2错误输出到命令提示符窗口 控制台日志输出到文件 1.bat 1>d:\log.log将控制台日志输出到文件 d:…...
ODrive移植keil(七)—— 插值算法和偏置校准
目录 一、角度读取1.1、硬件接线1.2、程序演示1.3、代码说明 二、锁相环和插值算法2.1、锁相环2.2、插值2.3、角度补偿 三、偏置校准3.1、硬件接线3.2、官方代码操作3.3、移植后的代码操作3.4、代码说明3.5、SimpleFOC的偏置校准对比 ODrive、VESC和SimpleFOC 教程链接汇总&…...
【肌电信号】OpenSignals使用方法 --- 肌电信号采集及导入matlab
一、 多通道采集教学 1. 数据线连接 将PLUX设备通过USB或蓝牙与电脑连接,注意确认在几号通道接线。 2.实时数据采集可视化 进行设置。需要在软件中选择你的PLUX设备,并配置相关的参数,如采样率、分辨率、信号类型等 3 支持数据回放和…...
STM32 多功能按键中断
key1 开关实现led1亮灭,key2开关实现蜂鸣器开关,key3开关实现风扇开关 main.c #include "uart.h" #include "key_it.h" #include "led.h" int main() {char c;char *s;uart4_init();//串口初始化all_led_init();key_it_config();fengshan_init…...
Linux-文件管理命令
绝对路径:从根目录开始描述的路径 pwd输入即为绝对路径, 开头一定是“/”,因为一定是从根目录开始走 相对路径:从当前路径开始描述的路径,开头不一定是“/”,因为不一定是从根目录开始走的 .:是当前目录 。…...
JS DataTable中导出PDF右侧列被截断的问题解决
JS DataTable中导出PDF右侧列被截断的问题解决 文章目录 JS DataTable中导出PDF右侧列被截断的问题解决一. 问题二. 解决办法三. 代码四. 参考资料 一. 问题 二. 解决办法 设置PDF大小和版型 orientation: landscape, pageSize: LEGAL,上述代码设置打印的PDF尺寸为LEGAL&…...
学习笔记-MongoDB(复制集,分片集集群搭建)
复制集群搭建 基本介绍 什么是复制集? 复制集是由一组拥有相同数据集的MongoDB实例做组成的集群。 复制集是一个集群,它是2台及2台以上的服务器组成,以及复制集成员包括Primary主节点,Secondary从节点和投票节点。 复制集提供了…...
Servlet与设计模式
1 过滤器和包装器 过滤器可以拦截请求及控制响应,而servlet对此毫无感知。过滤器有如下作用: 1)请求过滤器:完成安全检查、重新格式化请求首部或体、建立请求审计日志。 2)响应过滤器:压缩响应流、追加或…...
Python学习基础笔记六十五——布尔值
布尔对象: Python中有一种对象类型称之为布尔对象(英文叫bool)。 布尔对象只有两种取值,True和False。对应的是真和假,或者说是和否。True对应的是,False对应的是否。 我觉得这句话是一个关键:…...
ChatGPT生产力|实用指令(prompt)
GPT已经成为一个不可或缺的科研生产力了,但是大多数人只知晓采用直接提问、持续追问以及细节展开的方式来查阅相关资料,本文侧重于探讨“限定场景限定角色限定主题”、“可持续追问细节展开”等多种方式来获取更多信息,帮人们解决更多问题。 …...
【大数据Hive】hive select 语法使用详解
目录 一、前言 二、Hive select 完整语法树 三、Hive select 操作演示 3.1 数据准备 3.1.1 创建一张表 3.1.2 将数据load加载到t_usa_covid19表 3.1.3 再创建一张分区表 3.1.4 使用动态分区插入数据 3.2 select 常用语法 3.2.1 查询所有字段或者指定字段 3.2.2 查询…...
Android---java线程优化 偏向锁、轻量级锁和重量级锁
java 中的线程是映射到操作系统原生线程之上的,如果要阻塞或唤醒一个线程就需要操作系统的帮忙,这就需要从用户态转换到核心态。状态转换需要花费很多时间,如下代码所示: private Object lock new Object();private int value;p…...
处理机调度
目录 处理机调度概述 处理机调度的层次 低级调度 中级调度 高级调度 进程调度 进程调度的时机 进程调度的方式 非抢占式调度方式 抢占式调度方式 调度算法的评价指标 调度算法 先来先服务调度算法(FCFS,First Come First Serve) …...
新手零基础入门:跟着快马生成的互动教程完成jdk17下载安装与第一个程序
作为一名Java初学者,第一次接触JDK安装可能会觉得有些迷茫。最近我在InsCode(快马)平台上尝试了一个JDK17安装教程项目,整个过程比我预想的要简单很多。下面就把我的学习笔记分享给大家,希望能帮助到同样刚入门的朋友。 JDK17下载步骤 首先需…...
Linux 0.11内核调试实战:手把手教你用Bochs+GDB定位第一次页故障(附完整答案)
Linux 0.11内核调试实战:从页故障到内存管理的深度探索 当你第一次在Linux 0.11内核实验中遇到页故障时,那种既兴奋又困惑的感觉可能还记忆犹新。作为操作系统学习者,理解页故障不仅是掌握内存管理的关键,更是通往内核深处的一扇门…...
SEO_网站SEO诊断与性能优化的关键步骤
<h3 id"seo">网站SEO诊断与性能优化的关键步骤</h3> <p>在当今竞争激烈的互联网环境中,一个成功的网站不仅需要精美的设计,还需要优化的搜索引擎优化(SEO)和高效的性能。SEO和性能优化不仅能够提高网…...
用ESP32和2.13寸墨水屏,我把汉朔电子价签改造成了桌面网络时钟(附完整代码)
用ESP32和2.13寸墨水屏打造极简网络时钟:从电子价签到桌面艺术 在智能硬件爱好者的世界里,总有一些被遗忘的电子元件等待重生。汉朔电子价签的2.13寸墨水屏就是这样一个被低估的宝藏——它低功耗、高对比度的特性,配合ESP32的强大无线功能&am…...
除了浏览器点一点,Oracle 19c EM Express还能这么用?几个提升DBA效率的隐藏技巧
Oracle 19c EM Express高阶应用:解锁DBA效率提升的五大隐藏技巧 当你已经能够熟练地通过浏览器访问Oracle 19c EM Express时,是否思考过这个轻量级管理工具还能为你带来哪些惊喜?本文将带你超越基础操作,探索那些被大多数DBA忽略的…...
除了HDFS,DolphinScheduler资源中心还能怎么玩?聊聊S3与本地存储的配置差异
DolphinScheduler资源中心存储方案深度对比:从HDFS到S3的架构选型指南 在数据调度平台的实际部署中,存储后端的选型往往决定了系统整体的扩展性和运维成本。作为Apache DolphinScheduler的核心组件,资源中心支持多种存储类型配置,…...
深入剖析torchvision Faster-RCNN ResNet-50 FPN中的RPN机制与实现细节
1. RPN模块在Faster-RCNN中的核心作用 当你第一次接触目标检测时,可能会被各种专业术语搞得晕头转向。但别担心,RPN(Region Proposal Network)其实就像是一个"智能扫描仪",它的任务就是在图像中快速找出可能…...
3步打造永不丢失的聊天记录:RevokeMsgPatcher革新性防撤回技术全解析
3步打造永不丢失的聊天记录:RevokeMsgPatcher革新性防撤回技术全解析 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: http…...
iStoreOS软路由结合Cpolar内网穿透:打造稳定高效的居家远程办公网络
1. 为什么你需要iStoreOS软路由Cpolar组合? 最近两年远程办公越来越普遍,但很多朋友都遇到过这样的困扰:公司电脑里的文件急着要用,跑回办公室又太麻烦;出差在外需要调取内网资料,VPN连接却卡成幻灯片。我自…...
7维度解析:专业设计师的开源字体解决方案
7维度解析:专业设计师的开源字体解决方案 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 如何评估一款开源中文字体的技术价值? 在数字设计领域,字…...
