C ++ - 如何存储多维向量?

时间:2015-09-20 13:17:19

标签: c++ vector dynamic-memory-allocation

我对矢量有两个问题。

  1. 让我们说我有一个多维向量如下: -

    vector< vector<int> > A;

    然后A[0]A[1]等是向量。向量如何存储在A中?一世  表示有关向量A[0]A[1]的哪些信息存储在A中?  并且记忆重新分配各个向量,例如A[2]  导致重新分配A

  2. 其次,我试图通过重新分配来了解向量的地址是如何变化的。我使用了以下代码: -

  3. 代码:

    vector<int> A;
    int* x ;
    int* y ;
    
    vector<int>* ad;
    vector<int>* bd;
    
    for(int i = 0 ; i < 10000; i++){
    
        A.push_back(i);
        if(i == 2){
            y = &A[0];
            ad = &A;
        }
        x = &A[0];
        bd = &A;    
    
    }
    

    我发现,即使A的地址发生变化,A[0]的地址也不会改变。这是预期的,因为矢量通过使用newdelete在后​​台工作。但我的问题是有多少关于向量的信息(或哪些信息)存储在地址&A中(考虑到&A的地址没有改变)。这也是我对第一个问题的问题。

    我正在尝试更好地了解矢量默认情况下的工作方式。

2 个答案:

答案 0 :(得分:4)

  

有关向量的信息(或哪些信息)存储在地址&A

假设向量的数据与向量对象本身分开存储(通常在动态内存中),这是正确的。

矢量对象本身需要知道的三件事是

  • 向量数据的位置 - 我们需要此操作来执行[]运算符,
  • 当前分配的大小 - 我们需要知道何时增长数组,
  • 实际放入向量中的元素数量 - 我们需要知道push_back的位置以及从size()返回的内容。

可以实现不同的实现,在向量对象本身中存储少至单个指针。但是,典型的实现存储指向已分配块开头的指针,指向已分配块的活动部分结尾的指针,以及指向已分配块结尾的指针。

答案 1 :(得分:2)

关于向量的地址A的地址不会改变,不是因为A是向量,而是因为没有变量&# 39; s地址更改时,您定义它的函数(或者更确切地说,函数的特定调用)正在执行。我想你可能会混淆A的地址(你的例子中的ad,bd)和A用来存储向量元素的地址(x和y,本质上,在你的例子中)。向量分配,取消分配或重新分配存储。

请注意,A[0]不是您定义的变量。这是A.operator[]的调用结果;所以它的位置可以改变。

关于&A 实际存储的内容:这有点复杂。您需要查看C ++安装中的头文件vector。或者最好是在webpage for std::vector查看cppreference.com。请注意,有很多模板,一些子类,以及一些明确的模板特化,所以就像我说 - 复杂。您可能需要重新考虑是否真的想要深入了解这个容器是如何工作的一般规则,或者是否该类?公共方法和sizeof()数字现在已足够。