我编写了以下代码来接受竞争性编程网站上的测试用例。它使用结构input
的向量case
来同时存储给定测试用例的输入,然后一次处理一个(我已经省略了接受输入的循环)计算输出,因为它们与问题无关。)
#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
:
input
如何管理元素访问?它会将所有条目填入最大条目的大小吗?cases
的每个实例的指针向量来实现case
?我正在考虑这个问题,因为如果向量将每个元素填充到一个大小并浪费空间,或者它保持每个元素的位置,并且随机访问在时间上不是恒定的,因此无论如何都不会使用向量。答案 0 :(得分:5)
每种对象类型都有固定的大小。这是sizeof
返回的内容。 vector
本身通常包含指向对象数组的指针,已分配空间的对象数以及实际包含的对象数。这三件事的大小与向量中的元素数量无关。
例如,vector<int>
可能包含:
1)保留数据地址的int *
2)一个size_t
保存我们为
分配空间的对象数量
3)保持向量中包含的对象数量的size_t
。
无论向量中有多少个对象,这可能大约是24个字节。这就是sizeof(vector<int>)
将返回的内容。