如何分配具有可变大小元素的向量(在C ++中)?

时间:2017-03-13 10:49:39

标签: c++ vector memory-management stl

我编写了以下代码来接受竞争性编程网站上的测试用例。它使用结构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

有以下问题
  • 在这种情况下不会在O(1)时间内随机访问,因为每个元素的起始位置都不知道吗?
  • 当无法计算每个元素的起始位置时,向量input如何管理元素访问?它会将所有条目填入最大条目的大小吗?
  • 我是否应该使用指向cases的每个实例的指针向量来实现case?我正在考虑这个问题,因为如果向量将每个元素填充到一个大小并浪费空间,或者它保持每个元素的位置,并且随机访问在时间上不是恒定的,因此无论如何都不会使用向量。

1 个答案:

答案 0 :(得分:5)

每种对象类型都有固定的大小。这是sizeof返回的内容。 vector本身通常包含指向对象数组的指针,已分配空间的对象数以及实际包含的对象数。这三件事的大小与向量中的元素数量无关。

例如,vector<int>可能包含:
1)保留数据地址的int * 2)一个size_t保存我们为
分配空间的对象数量 3)保持向量中包含的对象数量的size_t

无论向量中有多少个对象,这可能大约是24个字节。这就是sizeof(vector<int>)将返回的内容。