【发布时间】:2017-08-03 08:36:03
【问题描述】:
我编写了以下代码来接受竞争性编程网站上的测试用例。它使用结构case 的向量input 一次性存储给定测试用例的输入,然后一次处理一个(我省略了接受输入并计算输出的循环,因为它们与问题无关。)
#include<iostream>
#include<vector>
using namespace std;
struct case{
int n, m;
vector<int> jobsDone;
};
int main(){
int testCase;
cin>>testCase;
vector<case> input;
input.reserve(testCase);
//The rest of the code is supposed to be here
return 0;
}
在编写此代码时,我意识到 input.reserve(t) 在元素大小可变的情况下(因为结构 case 的每个实例也有一个可变大小的向量)的工作会很困难.事实上,即使我没有明确地编写reserve() 语句,向量仍然会保留最少数量的elemtns。
对于这种特殊情况,我有以下关于向量input的问题:
- 在这种情况下,不是不可能在 O(1) 时间内进行随机访问,因为每个元素的开始位置都是未知的吗?
- 当无法计算每个元素的起始位置时,向量
input将如何管理元素访问?它会将所有条目填充到最大条目的大小吗? - 我是否应该使用指向
case的每个实例的指针向量来实现cases?我正在考虑这个问题,因为如果向量将每个元素填充到一个大小并浪费空间,或者它保持每个元素的位置,并且随机访问在时间上不是恒定的,因此无论如何都没有使用向量。
【问题讨论】:
-
向量只是一个指向一些内存和一些更多信息的指针。但是这个指针加上附加信息的大小是不变的。它指向的内存大小当然是不同的,但这与
input本身的大小无关。 -
为什么你认为“每个元素的开始位置是未知的”?
sizeof(vector<int>)始终具有完全相同的值,因此sizeof(case)也是如此。
标签: c++ vector memory-management stl