HM203 货架提前预留
HM203 货架提前预留
来源: 第 203 集 vector容器-预留空间
难度: 普及-
时间限制: 1s
空间限制: 64MB
题目描述
如果事先知道大约要装多少件货,可以先调用 reserve(n) 预留容量。单词是 reserve,不要和 reverse 搞混。
它和 resize 不同:reserve 只开辟空地,**不会初始化这些位置上的元素**,此时 size() 仍是 \(0\),不能去访问那些还没插入的格子。resize 才会得到可访问的元素(默认填 \(0\))。
动态扩展时,容器往往要「找更大的新空间 → 拷贝旧数据 → 释放旧空间」。每换一次底层存储,首元素的地址就会变。可以用指针记下 &v[0](必须在至少有一个元素之后),统计地址变化次数,当作扩容次数。
请对同一规模 \(n\) 做两组实验:
- 空货架先
reserve(n),输出此时的size(),以及capacity() >= n是否成立;再尾插 \(n\) 个整数,统计扩容次数。 - 另一座空货架**不**预留,直接尾插同样的 \(n\) 个整数,再统计扩容次数。
不要输出未预留时扩容次数的具体值(不同实现的扩容倍数不一样),只比较「预留后的扩容次数是否不超过未预留」。
输入格式
第一行一个整数 \(n\)。
第二行 \(n\) 个整数 \(a_i\),两组实验都按这个顺序尾插。
输出格式
共三行:
- 两个整数:
reserve之后、尚未尾插时的size(),以及capacity() >= n则为1否则0。 - 一个整数:预留后再尾插 \(n\) 次的扩容次数。
- 一个整数:若预留组的扩容次数 \(\le\) 未预留组,输出
1,否则0。
样例
输入 #1
8
1 2 3 4 5 6 7 8
输出 #1
0 1
1
1
输入 #2
1
42
输出 #2
0 1
1
1
说明
\(1 \le n \le 100000\),\(|a_i| \le 10^9\)。
reserve之后size仍为 \(0\),这和resize(n)会得到 \(n\) 个可访问元素不同。- 预留足够空间后再尾插,整段过程中底层地址通常只在第一次插入时记录一次,扩容次数为 \(1\)。
- 未预留时,实现会多次换更大的空间,扩容次数一般更多;本题只比较大小关系,不要求写出那个具体次数。
- 统计地址时必须先
push_back再取&v[0],空容器上取首地址是不允许的。
信息
- ID
- 1202
- 难度
- (无)
- 分类
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 通过率
- ?
- 上传者