首页 > 其他分享 >「学习笔记」vector

「学习笔记」vector

时间:2023-06-25 22:35:24浏览次数:39  
标签:emplace int 元素 back 笔记 学习 vector push

本文并不是 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 这个东西,dequequeue 等别的 STL 容器也有,用法都是一样的,但是,请不要搞混了。
emplace() 对应 insert 或者 push 再或者一些特殊 STL 的插入 (例如 map)
emplace_back() 对应 push_back()
emplace_front() 对应 push_front()
map 中还有 emplace_hint() 函数,用法与 emplace() 差不多。

标签:emplace,int,元素,back,笔记,学习,vector,push
From: https://www.cnblogs.com/yifan0305/p/17503961.html

相关文章

  • C语言学习笔记
    斐波那契定义:斐波那契数列是一个数列,其中每个数字是前两个数字之和,起始于0和1。数列的定义如下:F(0)=0F(1)=1F(n)=F(n-1)+F(n-2)(对于n>1)换句话说,斐波那契数列的第n个数字是前两个数字之和,而前两个数字分别是0和1。数列的前几个数字如下所示:0,1,1,......
  • celery笔记七之周期/定时任务及crontab定义
    本文首发于公众号:Hunter后端原文链接:celery笔记七之周期/定时任务及crontab定义periodictask,即为周期,或者定时任务,比如说每天晚上零点零分需要运行一遍某个函数,或者每隔半小时运行一遍该函数,都是这种任务的范畴。在第一篇笔记的时候我们就介绍过celery的组件构成,其中有一......
  • 6月25日java学习日记
    端午节小休息了几天,断开连接了几天,希望快速状态回到吧,今天了解了部分java异常类,Exceptions类为异常类,学习了throw关键字,以及了解了trycatch的用法(基本与C#相同),同时使用HasgMap以及List.of方法实现了斗地主案例。 ......
  • 烧写文件系统——韦东山嵌入式Linux学习笔记11
    原文:https://blog.csdn.net/longintchar/article/details/71319513本文实验环境:1.windows7(64bit)2.JZ2440(V2)使用u-boot烧写文件系统,一般有两种方法。1.通过USB下载功能2.通过TFTP功能通过USB下载功能烧写文件系统这种方法比较简单。操作步骤:(1)连接板子和PC(串口+USB)(2)进入u-......
  • 学习Java前的一些介绍
    1.java开发环境搭建卸载:删除Java的安装目录删除JAVA_HOME删除path下关于java的目录java-version验证安装:创建jdk和jre两个目录(还可以创建一个code目录存放代码)百度搜索jdk(建议安装jdk8)同意协议,找到对应版本并且下载双击安装jdk配置环境变量我......
  • Go学习圣经:Go语言实现高并发CRUD业务开发
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • “两地三中心”架构学习
    why:任何一个互联网系统,不论是淘宝,还是Google、Facebook,当发展到一定规模时,都会不可避免的触及到单点瓶颈。这里所说的“单点”,在系统的不同发展阶段表现不同。如下图: 在系统发展初期,服务器和应用单点最先成为瓶颈,解决的方法也很简单,加机器、拆应用;紧接着的数据库单点......
  • 各种在学习过程中遇到的问题集锦(不定期更新)
    各种在学习过程中遇到的问题一、IE控制台使用问题问题1、打开IE控制台中的“网络(Network)”时无法查看加载文件解决办法:进入控制台的设置部分点击还原默认值并刷新即可解决相关问题二、Java学习遇到的问题三、IDEA软件使用遇到的问题四、Mysql数据库使用遇到的问题......
  • MarkDown学习
    #MarkDown学习##标题###三级标题####四级标题   ##字体**hello,word!***hello,word!****hello,word!***~~hello,word!~~   ##引用>选择星星,走向人生巅峰##分割线 ---***##图片![截图](C:\Users\24874\Pictures\CameraRoll\桌面.jpg)##超链接[点......
  • 强化学习从基础到进阶-常见问题和面试必知必答[5]::梯度策略、添加基线(baseline)、优势函
    强化学习从基础到进阶-常见问题和面试必知必答[5]::梯度策略、添加基线(baseline)、优势函数、动作分配合适的分数(credit)1.核心词汇策略(policy):在每一个演员中会有对应的策略,这个策略决定了演员的后续动作。具体来说,策略就是对于外界的输入,输出演员现在应该要执行的动作。一般地,我......