【问题标题】:How are vectors(in C++) having elements of variable size allocated?如何分配具有可变大小元素的向量(在 C++ 中)?
【发布时间】: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&lt;int&gt;) 始终具有完全相同的值,因此 sizeof(case) 也是如此。

标签: c++ vector memory-management stl


【解决方案1】:

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

例如,vector&lt;int&gt; 可能包含:
1) 一个int * 持有数据的地址。
2) 一个size_t 保存着我们分配空间的对象的数量
3) 一个size_t 持有向量中包含的对象的数量。

无论向量中有多少对象,这可能是 24 字节左右。这就是sizeof(vector&lt;int&gt;) 将返回的内容。

【讨论】:

  • 大多数向量都是使用 3 个指针实现的。实现细节 ofc。
猜你喜欢
  • 1970-01-01
  • 2020-08-17
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 2020-04-01
  • 2011-08-20
相关资源
最近更新 更多