c++ 11标准模板(STL) std::vector (七)
定义于头文件 <vector>
| template< class T, | (1) | |
| namespace pmr { template <class T> | (2) | (C++17 起) |
1) std::vector 是封装动态数组的顺序容器。
2) std::pmr::vector 是使用多态分配器的模板别名。
| 元素相继存储,这意味着不仅可通过迭代器,还能用指向元素的常规指针访问元素。这意味着指向 vector 元素的指针能传递给任何期待指向数组元素的指针的函数。 | (C++03 起) |
vector 的存储是自动管理的,按需扩张收缩。 vector 通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长。 vector 所用的方式不在每次插入元素时,而只在额外内存耗尽时重分配。分配的内存总量可用 capacity() 函数查询。额外内存可通过对 shrink_to_fit() 的调用返回给系统。 (C++11 起)
重分配通常是性能上有开销的操作。若元素数量已知,则 reserve() 函数可用于消除重分配。
vector 上的常见操作复杂度(效率)如下:
- 随机访问——常数 O(1)
- 在末尾插入或移除元素——均摊常数 O(1)
- 插入或移除元素——与到 vector 结尾的距离成线性 O(n)
std::vector (对于 bool 以外的 T )满足容器 (Container) 、具分配器容器 (AllocatorAwareContainer) 、序列容器 (SequenceContainer) 、连续容器 (ContiguousContainer) (C++17 起)及可逆容器 (ReversibleContainer) 的要求。
容量
预留存储空间
std::vector<T,Allocator>::reserve
| void reserve( size_type new_cap ); |
增加 vector 的容量到大于或等于 new_cap 的值。若 new_cap 大于当前的 capacity() ,则分配新存储,否则该方法不做任何事。
reserve() 不更改 vector 的 size 。
若 new_cap 大于 capacity() ,则所有迭代器,包含尾后迭代器和所有到元素的引用都被非法化。否则,没有迭代器或引用被非法化。
参数
| new_cap | - | vector 的新容量 |
| 类型要求 | ||
- T 必须满足可移动插入 (MoveInsertable) 的要求。 | ||
返回值
(无)
异常
- 若 new_cap > max_size() 则为 std::length_error 。
- 任何
Allocator::allocate()所抛的异常(典型为 std::bad_alloc )
若抛出异常,则此函数无效果(强异常保证)。
| 若 | (C++11 起) |
复杂度
至多与容器的 size() 成线性。
注意
不能用 reserve() 减少容器容量。为该目的提供的是 shrink_to_fit() 。
正确使用 reserve() 能避免不必要的分配,但不适当地使用 reserve() (例如在每次 push_back() 调用前调用它)可能会实际增加重分配的数量(通过导致容量线性而非指数增长)并导致计算复杂度增加,性能下降。
返回当前存储空间能够容纳的元素数
std::vector<T,Allocator>::capacity
| size_type capacity() const; | (C++11 前) | |
| size_type capacity() const noexcept; | (C++11 起) |
返回容器当前已为之分配空间的元素数。
参数
(无)
返回值
当前分配存储的容量。
复杂度
常数。
通过释放未使用的内存减少内存的使用
std::vector<T,Allocator>::shrink_to_fit
| void shrink_to_fit(); | (C++11 起) |
请求移除未使用的容量。
它是减少 capacity() 到 size()非强制性请求。请求是否达成依赖于实现。
若发生重分配,则所有迭代器,包含尾后迭代器,和所有到元素的引用都被非法化。若不发生重分配,则没有迭代器或引用被非法化。
参数
(无)
| 类型要求 | ||
- T 必须满足可移动插入 (MoveInsertable) 的要求。 |
返回值
(无)
复杂度
至多与容器大小成线性。
注意
若 T 移动构造函数以外的操作抛出异常,则无效果。
修改器
改变容器中可存储元素的个数
std::vector<T,Allocator>::resize
| void resize( size_type count, T value = T() ); | (C++11 前) | |
| void resize( size_type count ); | (1) | (C++11 起) |
| void resize( size_type count, const value_type& value ); | (2) | (C++11 起) |
重设容器大小以容纳 count 个元素。
若当前大小大于 count ,则减小容器为其首 count 个元素。
| 若当前大小小于 | (C++11 前) |
| 若当前大小小于 1) 则后附额外的默认插入的元素 2) 则后附额外的 | (C++11 起) |
参数
| count | - | 容器的大小 |
| value | - | 用以初始化新元素的值 |
| 类型要求 | ||
- 为使用重载 (1) , T 必须满足可移动插入 (MoveInsertable) 和 可默认插入 (DefaultInsertable) 的要求。 | ||
- 为使用重载 (2) , T 必须满足可复制插入 (CopyInsertable) 的要求。 | ||
返回值
(无)
复杂度
与当前大小和 count 间的差成线性。若容量小于 count 则可能有重分配所致的额外复杂度。
异常
若抛出异常,则此函数无效果(强异常保证)。
| 重载 (1) 中,若 | (C++11 起) |
注意
若不想要重载 (1) 中的值初始化,例如元素是非类类型且不需要清零,则可以提供定制的 Allocator::construct 避免。
在重设大小到较小值时, vector 的容量决不减少,因为这会非法化所有的,而非只非法化等价的 pop_back() 调用序列所非法化的迭代器。
调用示例
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <functional>
#include <time.h>
#include <vector>using namespace std;struct Cell
{int x;int y;Cell() = default;Cell(int a, int b): x(a), y(b) {}Cell &operator +=(const Cell &cell){x += cell.x;y += cell.y;return *this;}Cell &operator +(const Cell &cell){x += cell.x;y += cell.y;return *this;}Cell &operator *(const Cell &cell){x *= cell.x;y *= cell.y;return *this;}Cell &operator ++(){x += 1;y += 1;return *this;}bool operator <(const Cell &cell) const{if (x == cell.x){return y < cell.y;}else{return x < cell.x;}}bool operator >(const Cell &cell) const{if (x == cell.x){return y > cell.y;}else{return x > cell.x;}}bool operator ==(const Cell &cell) const{return x == cell.x && y == cell.y;}
};std::ostream &operator<<(std::ostream &os, const Cell &cell)
{os << "{" << cell.x << "," << cell.y << "}";return os;
}int main()
{std::cout << std::boolalpha;std::mt19937 g{std::random_device{}()};srand((unsigned)time(NULL));auto generate = [](){int n = std::rand() % 10 + 110;Cell cell{n, n};return cell;};//3) 构造拥有 count 个有值 value 的元素的容器。std::vector<Cell> vector1(2, generate());//替换容器的内容。1) 以 count 份 value 的副本替换内容。std::cout << "vector1: ";std::copy(vector1.begin(), vector1.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;std::cout << std::endl;//打印数组真实地址std::cout << "vector1.data(): " << vector1.data() << std::endl;//增加 vector 的容量到大于或等于 new_cap 的值。//若 new_cap 大于当前的 capacity() ,则分配新存储,否则该方法不做任何事。vector1.reserve(1);//打印数组真实地址std::cout << "vector1.data(): " << vector1.data() << std::endl;//返回容器当前已为之分配空间的元素数。std::cout << "vector1.capacity(): " << vector1.capacity() << std::endl;vector1.reserve(3);//打印数组真实地址std::cout << "vector1.data(): " << vector1.data() << std::endl;std::cout << "vector1.capacity(): " << vector1.capacity() << std::endl;std::cout << std::endl;//请求移除未使用的容量。它是减少 capacity() 到 size()非强制性请求。vector1.shrink_to_fit();std::cout << "vector1.data(): " << vector1.data() << std::endl;std::cout << "vector1.capacity(): " << vector1.capacity() << std::endl;std::cout << std::endl;//3) 构造拥有 count 个有值 value 的元素的容器。std::vector<Cell> vector2(5, {101, 101});//替换容器的内容。1) 以 count 份 value 的副本替换内容。std::cout << "vector2: ";std::copy(vector2.begin(), vector2.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;//重设容器大小以容纳 count 个元素。//若当前大小大于 count ,则减小容器为其首 count 个元素。vector2.resize(3, {102, 102});std::cout << "vector2: ";std::copy(vector2.begin(), vector2.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;//若当前大小小于 count ,则后附额外元素,并以 value 的副本初始化vector2.resize(5, {103, 103});std::cout << "vector2: ";std::copy(vector2.begin(), vector2.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;//若当前大小小于 count ,1) 则后附额外的默认插入的元素vector2.resize(6);std::cout << "vector2: ";std::copy(vector2.begin(), vector2.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;return 0;
}
相关文章:
c++ 11标准模板(STL) std::vector (七)
定义于头文件 <vector> template< class T, class Allocator std::allocator<T> > class vector;(1)namespace pmr { template <class T> using vector std::vector<T, std::pmr::polymorphic_allocator<T>>; }(2)(C17…...
Contest3137 - 2022-2023-2 ACM集训队每月程序设计竞赛(1)五月月赛
A 1! 5! 46 169 有一种数字,我们称它为 纯真数。 它等于自身每一个数位的阶乘之和。请你求出不超过n的所有 纯真数。(注:纯真数不含有前导0)数据范围1e18 纯真数只有四个,注意0!1 1,2,145,40585 int n;cin>>n;int res[]{…...
如何使用 YOLOv8 神经网络检测图像中的物体
对象检测是一项计算机视觉任务,涉及识别和定位图像或视频中的对象。它是许多应用的重要组成部分,例如自动驾驶汽车、机器人和视频监控。 多年来,已经开发了许多方法和算法来查找图像中的对象及其位置。执行这些任务的最佳质量来自使用卷积神经网络。 YOLO 是这项任务最流行的…...
Python每日一练:小艺读书醉酒的狱卒非降序数组(详解快排)
文章目录 前言一、小艺读书二、醉酒的狱卒三、非降序数组总结 前言 今天这个非降序数组,阅读解理小学水平,说起来都是泪啊。我折腾了一天都没搞定,从冒泡写到快速排序。换了几种都还不行,我又给快排加上插入排序。结果还是不能全…...
手麻系统源码,PHP手术麻醉临床信息系统源码,手术前管理模块功能
手麻系统源码,PHP手术麻醉临床信息系统源码,手术前管理模块功能 术前管理模块主要有手术排班、手术申请单、手术通知单、手术知情同意书、输血血液同意书、术前查房记录、术前访视、风险评估、手术计划等功能。 功能: 手术排班:…...
AUTOSAR - ComM - 学习一 :基础知识+配置
目录 1、概述 1.1、总览 1.2、功能描述 1.3、依赖关系 2、功能SPEC 2.1、PNC...
手把手教你搭建ROS阿克曼转向小车之(增量式PID代码实现)
在上一篇文章中我们已经成功的把编码器的反馈值给计算出来,这篇文章将会讲解怎么使用反馈回来的速度值进行PID计算,从而闭环控制电机的速度。 PID算法介绍 1.开环控制系统 开环控制系统(open-loop control system)是指被控对象的输出(被控制量)对控制器…...
C语言函数大全-- t 开头的函数
C语言函数大全 本篇介绍C语言函数大全-- t 开头的函数 1. tan,tanf,tanl 1.1 函数说明 函数声明函数功能double tan(double x)计算 以弧度 x 为单位的角度的正切值(double)float tanf(float x)计算 以弧度 x 为单位的角度的正…...
安卓系统APP稳定性测试分析的研究报告
目录 第一章:概念 第二章:重要性 第三章:意义和作用 第四章:行业现状 第五章:常见测试方法和工具 第六章:实际测试场景 第七章:测试方案 第八章:测试方法 第九章࿱…...
【Java基础】集合
一、集合概述 为了方便对多个对象进行存储和操作,集合是一种Java容器,可以动态地把多个对象引用放入容器中 数组存储的特点 一旦初始化后,长度不可改变,元素类型不可改变提供的方法很少,对于添加、删除、获取实际元…...
【Android入门到项目实战-- 9.1】—— 传感器的使用教程
目录 传感器的定义 三大类型传感器 1、运动传感器 2、环境传感器 3、位置传感器 传感器开发框架 1、SensorManager 2、Sensor 3、SensorEvent 4、SensorEventListener 一、使用传感器开发步骤 1、获取传感器信息 1)、获取传感器管理器 2)、获取设备的传感器对象列…...
yolov8 浅记
目录 Pre: 1. YOLOv8 概述 2. 模型结构设计 3. Loss 计算 4.训练数据增强 5. 训练策略 6、部署推理 End Pre: yolo系列发布时间: 先贴一下yolo各系列的发布时间(说出来很丢人,我以为 yolox是 最新的): yoloX 2…...
前端009_类别模块_修改功能
第九章 1、需求分析2、Mock添加查询数据3、Mock修改数据4、Api调用回显数据5、提交修改后的数据6、效果1、需求分析 需求分析 当点击 编辑 按钮后,弹出编辑窗口,并查询出分类相关信息进行渲染。修改后点击 确定 提交修改后的数据。 2、Mock添加查询数据 请求URL: /article/…...
2022级吉林大学面向对象第一次上机测试
【注:解答全部为本人所写,仅供同学们学习时参考使用,请勿照搬抄袭!】 1、 1)略 2)如果main,f1,g1,g2或更多的函数之间有更为复杂的调用关系,头文件一般按怎样的规律写呢? 一般情况下…...
计算机体系结构总结:内存一致性模型 Memory consistency Model
存储一致性是为了保证多线程背景下的访存顺序,多线程的语句是可以交错执行,使得顺序不同产生不同的执行结果。 下面P2的输出结果可能是什么? P1, P2两个线程的语句是可以交叉执行的,比如1a, 2a, 2b, 1b;一个线程内的语…...
高速列车运行控制系统(CTCS)介绍
1、CTCS功能 安全防护 在任何情况下防止列车无行车许可运行防止列车超速运行防止列车超过进路允许速度防止列车超过线路结构规定的速度防止列车超过机车车辆构造速度防止列车超过临时限速及紧急限速防止列车超过铁路有关运行设备的限速防止列车溜逸 人机界面 以字符、数字及…...
C#“System.Threading.ThreadStateException”类型的未经处理的异常
备忘 最近做一个功能,从主界面进入另一个界面时,数据量较大,处理信息较多,程序宕机。而且点击程序还会提示程序无响应。不得已用另一个线程显示界面。但在界面中使用控件时,报错:“System.Threading.Thread…...
为什么要交叉编译?
一、什么是交叉编译、为什么要交叉编译 1、什么是交叉编译? 交叉编译:是在一个平台上生成另一个平台上的可执行代码。比如我们在 x86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 x86 平台上是不能运行的…...
java版本电子招标采购系统源码—企业战略布局下的采购
智慧寻源 多策略、多场景寻源,多种看板让寻源过程全程可监控,根据不同采购场景,采取不同寻源策略, 实现采购寻源线上化管控;同时支持公域和私域寻源。 询价比价 全程线上询比价,信息公开透明࿰…...
【MATLAB数据处理实用案例详解(17)】——利用概念神经网络实现柴油机故障诊断
目录 一、问题描述二、利用概念神经网络实现柴油机故障诊断原理三、算法步骤3.1 定义样本3.2 样本归一化3.3 创建网络模型3.4 测试3.5 显示结果 四、运行结果五、完整代码 一、问题描述 柴油机的结构较为复杂,工作状况非常恶劣,因此发生故障的可能性较大…...
万象视界灵坛惊艳效果:CLIP-ViT-L/14在低分辨率图像上的鲁棒性语义解析
万象视界灵坛惊艳效果:CLIP-ViT-L/14在低分辨率图像上的鲁棒性语义解析 1. 平台概览与核心价值 万象视界灵坛是一款基于OpenAI CLIP-ViT-L/14模型构建的多模态智能感知平台。不同于传统视觉识别系统的单调界面,这个平台将复杂的语义对齐过程转化为直观…...
FireRedASR Pro代码详解:从音频预处理到文本后处理全流程
FireRedASR Pro代码详解:从音频预处理到文本后处理全流程 1. 引言 如果你对语音识别感兴趣,想知道一段音频是怎么变成文字的,那么这篇文章就是为你准备的。我们这次不聊怎么用现成的工具,而是直接打开一个叫FireRedASR Pro的语音…...
自由学习记录(155)
中间拖动编辑,暂时性的调整,好的设计 可以撤回的误触远比需要记忆检索的多键要实用 如果系统提供了极其便捷的撤回(Undo)或容错机制,用户可以更放心地进行模糊操作,从而在宏观上提高效率。 身体本能 vs.…...
ScheduledExecutorService 和Timer的区别
一、本质区别TimerJDK 1.3 就有的单线程定时任务内部只有一个线程轮流执行所有任务基于绝对系统时间 System.currentTimeMillis()ScheduledExecutorServiceJDK 1.5 JUC 并发包提供线程池,多个线程执行任务基于相对时间(纳秒),不依…...
告别官方版SSE2坑!用linsys_pjsip 2.11.8在ARM32平台快速集成SIP与WebRTC AEC3
ARM32平台高效集成SIP与WebRTC AEC3:linsys_pjsip 2.11.8实战指南 在嵌入式音视频通信领域,ARM32架构设备因其低功耗和成本优势被广泛应用。但当你尝试在这些设备上部署PJSIP时,官方版本的SSE2指令集依赖就像一堵高墙,让许多开发者…...
别再只会用na.omit删数据了!R语言缺失值处理保姆级教程:从均值填补到随机森林实战
R语言缺失值处理实战:从基础填补到随机森林的完整指南 第一次拿到带有缺失值的数据集时,大多数人的本能反应是直接删除那些不完整的记录。这种简单粗暴的做法看似省事,却可能让你的分析结果偏离真实情况。想象一下,你正在分析一组…...
网安第十一节
四、Web后端PHP基础安全 PHP核心原理与文件上传 1、PHP介绍 1.定义 PHP(Hypertext Preprocessor,超文本预处理器)是一门开源的服务器端脚本编程语言,专门用于开发Web网站的后端逻辑。 2.核心关键 服务器端:PHP代码只…...
第三次学习C语言有感
我是一名大一学生,学习的专业是自动化,报专业时想着的是自动化可以走的方面是很广的,想着大学里面可以多多尝试不一样东西看自己对哪一样感兴趣。说实话,因为我对单片机感兴趣才驱使我学习C语言的,虽然嘴上说的是C语言…...
OpenClaw个人财务助手:Qwen3-14B分析消费记录生成报表
OpenClaw个人财务助手:Qwen3-14B分析消费记录生成报表 1. 为什么需要AI财务助手 上个月整理支付宝账单时,我盯着密密麻麻的消费记录发了半小时呆。餐饮、购物、交通的金额混在一起,根本分不清钱到底花在哪里。手动分类300多条记录后&#x…...
Skills 系统——让 AI 秒变专家
1. 技能的本质:提示词工程 在 nanobot 中,一个技能就是一个文件夹,核心是里面的 SKILL.md。 nanobot内置的skills放在project_path/nanobot/skills目录下,用户自定义的skills放在workspace/.nanobot/skills目录下 以 weather 技…...
