c++ - vector::reserve 有什么问题?
问题描述
我只是想为竞争性编程学习 STL 并坚持这个疑问!1. 当我使用 vector::reserve(n) 时,标记为 loop1 和 loop2 的循环不打印任何内容。2. 但是当我使用 vector::assign(n,0) 我的循环标记为循环 1 和循环 2 工作正常。为什么会这样?
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
int test;
scanf("%d", &test);
while (test > 0) {
int n;
scanf("%d", &n);
vector<int> arr;
arr.reserve(n);
//arr.assign(n,0);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
sort(arr.begin(), arr.end());
vector<int>::iterator itr;
// loop1
for (int x : arr) {
printf("%d ", x);
}
//loop2
for (itr = arr.begin(); itr != arr.end(); itr++) {
printf("%d ", *itr);
}
test--;
}
return 0;
}
解决方案
这是一个常见的错误。std::vector::reserve
不创建元素或改变容器的大小;你实际上导致了未定义的行为。reserve
只改变容量。您正在寻找std::vector::resize
更改尺寸。为了清楚起见,这是一个示例:
#include <iostream>
#include <vector>
int main() {
std::vector<int> ivec;
std::cout << ivec.size() << " - " << ivec.capacity() << '\n'; // 0 - 0
ivec.reserve(100);
std::cout << ivec.size() << " - " << ivec.capacity() << '\n'; // 0 - 100
ivec.resize(30);
std::cout << ivec.size() << " - " << ivec.capacity() << '\n'; // 30 - 100
}
推荐阅读
- youtube - YouTube Data API:上传我的视频时选择目标 YT 频道
- terraform - 如何检测在 Terraform 之外所做的更改?
- python - Python/Flask 获取 HTML 输入并将它们存储在 SQL Server 数据库中
- php - 仅将多维数组与键数组进行比较
- iot - ModuleClient IoT Hub Edge 设备:如何从设备队列接收消息?
- c# - Word Automation 重置编号方案
- json - 处理应该是 json 的数据框列时出现 JSONDecodeError
- loops - 更改变量顺序后“for”循环突然无限
- c# - 如何将“未知”对象作为参数传递并使用它的原始对象类型进行反序列化
- c++ - 从非提升的插件 DLL 随意提升自己的代码