本文并不是 vector 的入门教程。

定义

std::vector 是封装动态数组的顺序容器。

vector 通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长。如果元素数量已知,可以使用 reserve() 函数提前分配内存。

操作函数

由于 vector 大家比较熟悉了,这里给大家带来一些其他不太常用的操作。

1. at(x)

访问元素,相当于 [],但是 at() 会进行越界判断,如果越界,会返回异常(即 return 3;),程序停止。

常数比 [] 稍大,即速度稍慢,但是调试的时候会比较方便。由于 [] 不会进行越界处理,且 DEV-C++ 有程序保护,所以你会访问到一个奇怪的元素,在 OJ 上提交,最终导致答案错误,而不是 RE,会对查错产生干扰。

2. resize(x, y)

这个函数与 reserve 函数很像,都是分配空间的。

resize() 函数还会改变容器大小,并进行赋值,resize(n, 1) 就是将 vector 的长度和空间改为 \(n\),且复制元素为 \(1\);但是 reserve 并不会赋值,因此 vector 里面是随机的元素。

强烈建议:如果想进行赋值操作,最好是先用 clear() 函数清空 vector,在使用 resize() 来定长赋值。

3. swap()

交换两个 vector 中的元素,但是是常数复杂度,不是 \(O_n\) 的。

在写长链剖分优化 DP,合并 DP 数组时有用过,因为复杂度比较优秀。

4. emplace() 与 emplace_back()

它们的功能相当于 insert 与 push_back(),但是也有区别。

就拿 emplace_back() 与 push_back() 举例:

push_back():向容器中加入一个右值元素(临时对象)时,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放入容器中。原来的临时变量释放。这样造成的问题就是临时变量申请资源的浪费。

emplace_back():引入了右值引用,转移构造函数,在插入的时候直接构造,只需要构造一次即可。

简化一点:push_back() 会先在插入时构造一个临时变量,再拷贝进入 vector,而 emplace_back() 则直接在插入时构造并放入 vector 中,没有拷贝的过程。

因此,emplace_back() 会比 push_back() 快,但也正是由于构造函数使用的区别,两者在一些情况下的使用并不一样。

(1) 一般情况下直接插入单个元素

vector<int> a;
a.push_back(1);
a.emplace_back(1);

两者的用法是一样的。

(2) 当变量类型为 pair 时

vector<pair<int, int> > a;
a.push_back({1, 2});
a.emplace_back(1, 2);

由于 emplace_back() 是直接构造,因此,只需要按照元素的顺序依次插入即可(元素要一一对应!),而 push_back() 则是将 {1, 2} 放入一个临时的 pair 类型的变量中,再拷贝进去。

(3) 当变量类型是结构体类型时

struct node {
int u, v, w;
}; vector<int> a; a.push_back(node{1, 2, 3});
a.emplace_back(1, 2, 3);

push_back() 函数没有任何问题,但是,emplace_back() 就无法通过编译。

遇到这种情况,我们需要为这个结构体写一个构造函数,才可以使用 emplace_back(),像这样

struct node {
int u, v, w; node(int a, int b, int c) {
u = a, v = b, w = c;
} // 或者这样
// node(int a, int b, int c) : u(a), v(b), w(c) {};
}; vector<int> a; a.push_back(node{1, 2, 3});
a.emplace_back(1, 2, 3);

这样就是对的了。

5. 输入元素

这是一个慢但是看着很高级的写法。

vector<int> a;
a.resize(10);
for (auto &i : a) {
cin >> i;
}

后记

关于 vector,我个人觉得这是个非常好用的 STL,方便,但是,这正因为是 STL,因此会带有常数,很可能被卡。

尽管如此,我还是很喜欢 vector。

此外,关于 emplace 这个东西,deque、queue 等别的 STL 容器也有,用法都是一样的,但是,请不要搞混了。

emplace() 对应 insert 或者 push 再或者一些特殊 STL 的插入 (例如 map)

emplace_back() 对应 push_back()

emplace_front() 对应 push_front()

在 map 中还有 emplace_hint() 函数,用法与 emplace() 差不多。

「学习笔记」vector的更多相关文章

  1. 「学习笔记」FFT 快速傅里叶变换

    目录 「学习笔记」FFT 快速傅里叶变换 啥是 FFT 呀?它可以干什么? 必备芝士 点值表示 复数 傅立叶正变换 傅里叶逆变换 FFT 的代码实现 还会有的 NTT 和三模数 NTT... 「学习笔 ...

  2. 「学习笔记」字符串基础:Hash,KMP与Trie

    「学习笔记」字符串基础:Hash,KMP与Trie 点击查看目录 目录 「学习笔记」字符串基础:Hash,KMP与Trie Hash 算法 代码 KMP 算法 前置知识:\(\text{Border} ...

  3. 「学习笔记」平衡树基础:Splay 和 Treap

    「学习笔记」平衡树基础:Splay 和 Treap 点击查看目录 目录 「学习笔记」平衡树基础:Splay 和 Treap 知识点 平衡树概述 Splay 旋转操作 Splay 操作 插入 \(x\) ...

  4. 「学习笔记」Min25筛

    「学习笔记」Min25筛 前言 周指导今天模拟赛五分钟秒第一题,十分钟说第二题是 \(\text{Min25}​\) 筛板子题,要不是第三题出题人数据范围给错了,周指导十五分钟就 \(\text{AK ...

  5. 「学习笔记」FFT 之优化——NTT

    目录 「学习笔记」FFT 之优化--NTT 前言 引入 快速数论变换--NTT 一些引申问题及解决方法 三模数 NTT 拆系数 FFT (MTT) 「学习笔记」FFT 之优化--NTT 前言 \(NT ...

  6. 「学习笔记」Treap

    「学习笔记」Treap 前言 什么是 Treap ? 二叉搜索树 (Binary Search Tree/Binary Sort Tree/BST) 基础定义 查找元素 插入元素 删除元素 查找后继 ...

  7. 「学习笔记」wqs二分/dp凸优化

    [学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...

  8. 「学习笔记」ST表

    问题引入 先让我们看一个简单的问题,有N个元素,Q次操作,每次操作需要求出一段区间内的最大/小值. 这就是著名的RMQ问题. RMQ问题的解法有很多,如线段树.单调队列(某些情况下).ST表等.这里主 ...

  9. 「学习笔记」递推 & 递归

    引入 假设我们想计算 \(f(x) = x!\).除了简单的 for 循环,我们也可以使用递归. 递归是什么意思呢?我们可以把 \(f(x)\) 用 \(f(x - 1)\) 表示,即 \(f(x) ...

  10. 「学习笔记」动态规划 I『初识DP』

    写在前面 注意:此文章仅供参考,如发现有误请及时告知. 更新日期:2018/3/16,2018/12/03 动态规划介绍 动态规划,简称DP(Dynamic Programming) 简介1 简介2 ...

随机推荐

  1. MySQL(五)配置文件、系统变量与MySQL架构

    1 配置文件的使用 my.cnf配置文件 /etc/my.cnf: [root@hadoop103 ~]# cat /etc/my.cnf # For advice on how to change ...

  2. 武装你的WEBAPI-OData与DTO

    前面写了很多有关OData使用的文章,很多读者会有疑问,直接将实体对象暴露给最终用户会不会有风险?$expand在默认配置的情况下,数据会不会有泄露风险? 答案是肯定的,由于OData的特性,提供给我 ...

  3. JavaScript原生兼容大全-持续更新

    JavaScript兼容-持续更新 1.css非行内样式操作 // currentStyle用于IE低版本 getComputed用于主流浏览器 // element 目标元素 attribute 目 ...

  4. Godot 4.0 加载为占位符(InstancePlaceholder)的用法和特点

    加载为占位符的功能设计上是用来辅助选择性加载场景的.比如一个很庞大的3D世界,玩家一时之间只会处在世界一小部分区域内,同时让整个地图驻留于内存是不现实的,此时需要选择性地灵活加载地图,使用Godot的 ...

  5. selenium 执行js脚本

    使用 selenium 直接在当前页面中进行js交互 使用selenium 执行 Js 脚本 要使用 js 首先要知道 js 怎么用,现在举个简单得例子,就用12306举例子, 它的首页日期选择框是只 ...

  6. mac 如何快捷键打开当前文件夹对应的终端窗口

  7. 2022-04-23:给定你一个整数数组 nums 我们要将 nums 数组中的每个元素移动到 A 集合 或者 B 集合中 使得 A 集合和 B 集合不为空,并且 average(A) == aver

    2022-04-23:给定你一个整数数组 nums 我们要将 nums 数组中的每个元素移动到 A 集合 或者 B 集合中 使得 A 集合和 B 集合不为空,并且 average(A) == aver ...

  8. 2021-05-29:最常使用的K个单词II。在实时数据流中找到最常使用的k个单词,实现TopK类中的三个方法: Top

    2021-05-29:最常使用的K个单词II.在实时数据流中找到最常使用的k个单词,实现TopK类中的三个方法: TopK(k), 构造方法.add(word),增加一个新单词.topk(),得到当前 ...

  9. 码云SSH公钥及仓库建设

    码云SSH公钥及仓库建设 第一步注册码云账号并按图示点击 在新打开的界面,按图示点击 进入点击如下图步骤 然后照着做下图 ssh-keygen -t rsa -C "xxxxx@xxxxx. ...

  10. 2023.5.16 总结 AT_abc260_g

    atcoder AT_abc260_g 题意 一个点 O 可以影响到其它点,能影响到的点的坐标满足:(\((u, v)\) 为当前点的坐标,\((x, y) 为能影响到的点的坐标\)) \(u\le ...