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 显示结果 四、运行结果五、完整代码 一、问题描述 柴油机的结构较为复杂,工作状况非常恶劣,因此发生故障的可能性较大…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
