向量(以C 为单位)如何具有分配可变大小的元素

How are vectors(in C++) having elements of variable size allocated?

本文关键字:分配 元素 何具 为单位 向量      更新时间:2023-10-16

我编写了以下代码,以在竞争性编程网站上接受测试案例。它使用结构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?我之所以考虑这一点,是因为如果向量将每个元素填充到一个大小和浪费空间,或者它将每个元素保持到每个元素的位置,并且随机访问并不恒定,因此无论如何,矢量都没有用。

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

例如,vector<int>可能包含:
1)持有数据地址的int *
2)A size_t持有我们分配给
的对象数量的数量3) size_t保留向量中包含的对象数量。

无论矢量中有多少个对象,这可能会在24个字节左右。这就是sizeof(vector<int>)将返回的。