关于向量中动态分配的问题

Question on dynamic allocation in vectors

#include <iostream>
#include <vector>
#include "malloc.h"

using namespace std;

int main() {
    // Write C++ code here
    vector<vector<vector<int*>>> storage;
    for (int i=0; i< 13; i++)
    {
        storage.push_back(vector<vector<int*>>()); 
        for (int j=0; j< 13; j++)
        {
            storage[i].push_back(vector<int*>());

            storage[i][j].push_back((int*)malloc(5 * sizeof(int)));
               
            for (int k =0; k<4; k++)
            {
                storage[i][j][k]=k;
            }
        }
    }
    
    return 0;
}

我试图在最后一个向量的最内层维度内动态分配一个列表,但事实证明,当我尝试为向量设置一个值时它会抛出一些编译错误:

error: invalid conversion from 'int' to '__gnu_cxx::__alloc_traits<std::allocator<int*>, int*>::value_type' {aka 'int*'} [-fpermissive]

我假设您正在尝试对 C 样式数组进行索引,在这种情况下,您将不得不删除向量的一维,如下所示:

vector<vector<int*>> storage;

然后您可以按预期索引到 C 样式数组。

storage[i][j] 当前访问 int*vector,您只在其中压入了一个元素。如果你想让你的代码的其余部分保持不变,你可以只做 storage[i][j][0][k]=k,但是,我建议删除一个维度。

错误消息告诉您您正在尝试将 int 分配给 int*。具体来说,关于这个声明:

storage[i][j][k]=k;

storage[i][j][k] returns(引用)一个 int*,但 k 是一个 int

因为你有 3 层向量包含一个 int[] 数组,你需要 4 个循环来初始化各个 ints,但你只有 3 个循环,所以添加另一个循环:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<vector<vector<int*>>> storage;
    for (int i = 0; i < 13; ++i)
    {
        storage.push_back(vector<vector<int*>>()); 

        for (int j = 0; j < 13; ++j)
        {
            storage[i].push_back(vector<int*>());

            for(int k = 0; k < N; ++k) // <-- decide what N should be!
            {
                storage[i][j].push_back(new int[5]);
               
                for (int m = 0; m < 5; ++m)
                {
                    storage[i][j][k][m] = k;
                }
            }
        }
    }
    
    // don't forget to delete[] all of the new[]'ed arrays!
    // consider using either std::unique_ptr<int[]> or
    // std::array<int,5> instead of int* ...

    return 0;
}

我建议简化代码以使其更具可读性,例如:

#include <iostream>
#include <vector>
#include <array>
using namespace std;

using arr5Ints = array<int, 5>;
using vec1D_arr5Ints = vector<arr5Ints>;
using vec2D_arr5Ints = vector<vec1D_arr5Ints>;
using vec3D_arr5Ints = vector<vec2D_arr5Ints>;

int main() {
    vec3D_arr5Ints storage(
        13,
        vec2D_arr5Ints(
            13,
            vec1D_arr5Ints(N) // <-- decide what N should be!
        )
    );

    for (auto &vec2d : storage)
    {
        for (auto &vec1d : vec2d)
        {
            for(auto &arr : vec1d)
            {
                int k = 0;
                for (int &i : arr)
                {
                    i = k++;
                }
            }
        }
    }

    return 0;
}