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) 的要求。
成员函数
构造 vector
std::vector<T,Allocator>::vector
| vector(); | (1) | (C++17 前) |
| vector() noexcept(noexcept(Allocator())); | (C++17 起) | |
| explicit vector( const Allocator& alloc ); | (2) | (C++17 前) |
| explicit vector( const Allocator& alloc ) noexcept; | (C++17 起) | |
| explicit vector( size_type count, const T& value = T(), const Allocator& alloc = Allocator()); | (3) | (C++11 前) |
| vector( size_type count, const T& value, const Allocator& alloc = Allocator()); | (C++11 起) | |
| explicit vector( size_type count ); | (4) | (C++11 起) (C++14 前) |
| explicit vector( size_type count, const Allocator& alloc = Allocator() ); | (C++14 起) | |
| template< class InputIt > vector( InputIt first, InputIt last, const Allocator& alloc = Allocator() ); | (5) | |
| vector( const vector& other ); | (6) | |
| vector( const vector& other, const Allocator& alloc ); | (6) | (C++11 起) |
| vector( vector&& other ); | (7) | (C++11 起) (C++17 前) |
| vector( vector&& other ) noexcept; | (C++17 起) | |
| vector( vector&& other, const Allocator& alloc ); | (8) | (C++11 起) |
| vector( std::initializer_list<T> init, | (9) | (C++11 起) |
从各种数据源构造新容器,可选地使用用户提供的分配器 alloc 。
1) 默认构造函数。构造拥有默认构造的分配器的空容器。
2) 构造拥有给定分配器 alloc 的空容器。
3) 构造拥有 count 个有值 value 的元素的容器。
4) 构造拥有个 count 默认插入的 T 实例的容器。不进行复制。
5) 构造拥有范围 [first, last) 内容的容器。
| 若 | (C++11 前) |
| 此重载仅若 | (C++11 起) |
6) 复制构造函数。构造拥有 other 内容的容器。若不提供 alloc ,则如同通过调用 std::allocator_traits<allocator_type>::select_on_container_copy_construction(other.get_allocator()) 获得分配器。
7) 移动构造函数。用移动语义构造拥有 other 内容的容器。分配器通过属于 other 的分配器移动构造获得。移动后,保证 other 为 empty() 。
8) 有分配器扩展的移动构造函数。以 alloc 为新容器的分配器,从 other 移动内容;若 alloc != other.get_allocator() ,则它导致逐元素移动。(该情况下,移动后不保证 other 为空)
9) 构造拥有 initializer_list init 内容的容器。
参数
| alloc | - | 用于此容器所有内存分配的分配器 |
| count | - | 容器的大小 |
| value | - | 以之初始化容器元素的值 |
| first, last | - | 复制元素的来源范围 |
| other | - | 用作初始化容器元素来源的另一容器 |
| init | - | 用作初始化元素来源的 initializer_list |
复杂度
1-2) 常数
3-4) 与 count 成线性
5) 与 first 和 last 的距离成线性
6) 与 other 的大小成线性
7) 常数。
8) 若 alloc != other.get_allocator() 则为线性,否则为常数。
9) 与 init 的大小成线性。
异常
到 Allocator::allocate 的调用可能抛出。
注意
在容器移动构造(重载 (7) )后,指向 other 的引用及迭代器(除了尾迭代器)保持合法,但指代现于 *this 中的元素。当前标准由 [container.requirements.general]/12 中的总括陈述作出此保证,而 LWG 2321 正在考虑更严格的保证。
重载 (4) 对如 int 的非类类型元素清零,这与 new[] 将元素保持未初始化的行为不同。为匹配 new[] 的行为,可提供保留元素未初始化的自定义 Allocator::construct 。
析构 vector
std::vector<T,Allocator>::~vector
| ~vector(); |
销毁容器。调用元素的析构函数,然后解分配所用的存储。注意,若元素是指针,则不销毁所指向的对象。
复杂度
与容器大小成线性。
调用示例
#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;};//从各种数据源构造新容器,可选地使用用户提供的分配器 alloc 。//1) 默认构造函数。构造拥有默认构造的分配器的空容器。//2) 构造拥有给定分配器 alloc 的空容器。std::vector<Cell> vector1;std::cout << "vector1 empty: " << vector1.empty() << std::endl;//3) 构造拥有 count 个有值 value 的元素的容器。std::vector<Cell> vector2(6, generate());std::cout << "vector2: ";std::copy(vector2.begin(), vector2.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;//4) 构造拥有个 count 默认插入的 T 实例的容器。不进行复制。std::vector<Cell> vector3(6);std::cout << "vector3: ";std::copy(vector3.begin(), vector3.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;//5) 构造拥有范围 [first, last) 内容的容器。//6) 复制构造函数。构造拥有 other 内容的容器。若不提供 alloc ,则如同通过调用获得分配器std::vector<Cell> vector4(vector2.begin(), vector2.end());std::cout << "vector4: ";std::copy(vector4.begin(), vector4.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;//7) 移动构造函数。用移动语义构造拥有 other 内容的容器。//分配器通过属于 other 的分配器移动构造获得。移动后,保证 other 为 empty() 。//8) 有分配器扩展的移动构造函数。以 alloc 为新容器的分配器,//从 other 移动内容;若 alloc != other.get_allocator() ,则它导致逐元素移动。std::vector<Cell> vector5(std::move(vector2));std::cout << "vector5: ";std::copy(vector5.begin(), vector5.end(), std::ostream_iterator<Cell>(std::cout, " "));std::cout << std::endl;std::cout << "vector2 empty: " << vector2.empty() << std::endl;//9) 构造拥有 initializer_list init 内容的容器。std::vector<Cell> vector6({{101, 101}, {102, 102}, {103, 103},{104, 104}, {105, 105}, {106, 106}});std::cout << "vector6: ";std::copy(vector6.begin(), vector6.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…...
Python 循环技巧
目录 在字典中循环时,用 items() 方法可同时取出键和对应的值: 在序列中循环时,用 enumerate() 函数可以同时取出位置索引和对应的值: 同时循环两个或多个序列时,用 zip() 函数可以将其内的元素一一匹配:…...
【Java笔试强训 7】
🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥Fibona…...
工作7年的程序员,明白了如何正确的“卷“
背景 近两年,出台和落地的反垄断法,明确指出要防止资本无序扩张。 这也就导致现在的各大互联网公司,不能再去染指其他已有的传统行业,只能专注自己目前存量的这些业务。或者通过技术创新,开辟出新的行业。 但创新这…...
数学建模——查数据
如果选择C题的小伙伴常常需要查找一些数据,那么这些数据一般都可以从哪里找到呢? 常用的查数据平台 优先在知网、谷歌学术等平台搜索国家统计局 最全面,月度季度年度,各地区各部门各行业,包罗万象 https://data.stat…...
PAT A1019 General Palindromic Number
1019 General Palindromic Number 分数 20 作者 CHEN, Yue 单位 浙江大学 A number that will be the same when it is written forwards or backwards is known as a Palindromic Number. For example, 1234321 is a palindromic number. All single digit numbers are pa…...
ChatGPT会颠覆SEO内容创作吗
近几年 AI 的发展日新月异。除了搜索算法本身大规模应用人工智能,我也一直关注着 AI 用于写作的进展。 上篇关于 Google 有用内容更新的帖子还在说,高质量内容创作是 SEO 最难的事之一,对某些网站来说,如果能有工具帮助ÿ…...
Maven私服搭建
为什么要搭建私服 通常在maven项目的pom.xml文件中引入了某个依赖包之后,maven首先会去本地仓库去搜索,本地仓库搜索不到会去maven的配置文件settings.xml中配置的maven镜像地址去找,比如: <mirrors><!-- mirror| Specif…...
Ajax和Json综合案例
1. 查询所有 创建brand.html,使用axios发送请求,其中查询一般采用get的请求方式 <script src"js/axios-0.18.0.js"></script><script>//1. 当页面加载完成后,发送ajax请求window.onload function () {//2. 发送ajax请求axi…...
【genius_platform软件平台开发】第九十四讲:int64_t的格式化问题(lld和PRId64)
问题起因是在进行上位机软件优化的工作安排时,同事对unsigned long long 类型的时间戳进行了格式化输出优化,从%ull优化为了% PRIu64,我进行代码合并请求处理的时候突然感觉这个可以仔细查一下。查阅到的相关资料如下: * 1. int6…...
多模态之clip
论文:Learning Transferable Visual Models From Natural Language Supervision Github:https://github.com/OpenAI/CLIP OpenAI出品 论文通过网络爬取4亿(image, text)对,使用对比学习的方法训练得到clip(Contrastive Languag…...
Lombok常用注解
文章目录 一、简介二、Idea中配置三、Maven中配置四、相应注解1、Data2、RequiredArgsConstructor3、AllArgsConstructor4、NoArgsConstructor5、Getter/Setter:6、ToString7、EqualsAndHashCode8、Builder9、NonNull10、Log11、Slf4j12、Log4j213、SneakyThrows14、Cleanup15、…...
加拿大各省接受公立教育的初始年龄汇总 — 供携子女赴加的访学、博后参考
近年来到加拿大从事访问学者和博士后研究的申请者日益增多,有些申请者想带孩子同去上公立学校。因为加拿大各省教育局政策有差异,所以入学(包括学前班)年龄不同,为此知识人网小编整理本文为大家解惑答疑。 加拿大为本国…...
数字化工厂:虹科Vuzix AR眼镜在工业制造中的革新应用
随着现代科学技术和新兴需求的快速增长,增强现实(AR)、各种“现实”产品与技术不断涌入创新市场,新兴用例数量正在快速增长,可以肯定,在可预见的未来,AR技术将成为各行各业的生产与工作主流。 增强现实(AR&…...
配置出接口方式的单服务器智能DNS
组网需求 如图1所示,企业部署了一台ISP1服务器对外提供Web服务,域名为www.example.com。ISP1服务器的私网IP地址为10.1.1.10,服务器映射后的公网IP地址为1.1.1.10。企业的DNS服务器上存在域名www.example.com与ISP1服务器地址1.1.1.10的对应关…...
数据结构初阶(栈和队列)
文章目录 一、栈1.1 什么是栈1.2 栈的使用(1)底层代码(2)方法(3)栈的应用 二、队列2.1 什么是队列2.2 队列的使用(1)底层代码的实现(2)队列的使用 2.3 双端队…...
IDEA实用设置
1、设置全局编码统一为UTF-8 file>setting中搜索框输入file encoding修改格式为UTF-8 2、设置文字大小 file>setting中搜索框输入font修改字体大小 3、配置maven file>setting中搜索框输入maven修改maven的路径、conf文件、文件仓库 4、idea中实现Serializable提示…...
关联爆破-RSA分解
今天遇到一个RSA题,给出n和pq求分解,翻箱倒柜也没找着原来写的程序,这里重写一下。都是编程的活。 第1种情况,给出p^q 这种情况当p,q相同位相同时为0,不同时为1,爆破的时候只需要逐位判断两种情况&#x…...
Netty内存管理--内存池PoolArena
一、写在前面 到这里, 想必你已知道了Netty中的内存规格化(SizedClass), Page和SubPage级别的内存分配, 但是具体使用者不应该关心应该申请page还是subpage。而且从过去的经验来说, 申请page/subpage的数量也是个动态值, 如果申请使用完之后就释放那使用内存池的意义就不大。N…...
RabbitMQ 发布订阅模式,routing路由模式,topic模式
发布订阅模式 一个消息可以由多个消费者消费同一个消息 消费者1和2同时消费了该消息 举例 public static void main(String[] args) throws IOException, TimeoutException {//1 创建连接工厂ConnectionFactory connectionFactorynew ConnectionFactory();//2 设置rabbitmq …...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
