【问题标题】:Question on dynamic allocation in vectors向量中的动态分配问题
【发布时间】:2022-01-10 04:21:08
【问题描述】:
#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;
}

我正在尝试在最后一个向量的最内层维度内动态分配一个列表,但是当我尝试为向量设置一个值时它会引发一些编译错误:

错误:从 'int' 到 '__gnu_cxx::__alloc_traits<:allocator>::value_type' {aka 'int*'} [-fpermissive] 的无效转换

【问题讨论】:

  • 如果您询问错误消息的含义,请将完整消息粘贴到您的问题中。我怀疑您的错误与int 和int* 之间的差异有关。
  • 我正在尝试在最后一个向量的最内层动态分配一个列表不要,只需使用另一个向量,让它为您处理内存管理。
  • 每当你觉得需要使用 C 风格的演员表时(就像你对 (int*)malloc(...) 所做的那样),你应该把它当作你做错了什么的迹象。
  • 您想要 3D 还是 4D 阵列?如果你想要 4D,你的嵌套循环太少,[] 的级别太少。如果你想要 3D,你的一层数组太多了。 (在这种情况下,我建议删除* 和malloc。顺便说一下malloc.h 是一个错误的标题,你需要stdlib.h)事实上你有storage[i] 和storage[i][j] 在相同的缩进级别正确彼此相邻是暗示正在发生一些可疑的事情。
  • 允许您在对象的大部分维度上使用std::vector 似乎很不寻常,但对于其中一个维度,您必须使用非常不友好的C++ malloc。

标签: c++ arrays vector struct stl


【解决方案1】:

我假设您正在尝试对 C 样式数组进行索引,在这种情况下,您必须剪掉向量的一维,如下所示:

vector<vector<int*>> storage;

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

storage[i][j] 当前访问的是int* 中的vector,其中您只推送了一个元素。如果您想保持其余代码相同,您可以执行storage[i][j][0][k]=k,但是,我建议您删除一个维度。

【讨论】:

  • 谢谢。但是在我粘贴的代码中,这样做会导致分段错误。看起来我也错过了其他东西。
  • 我已经更正了我的答案! ^^
【解决方案2】:

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

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

storage[i][j][k] 返回(引用)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;
}

【讨论】:

    猜你喜欢
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2011-10-28
    • 2021-06-05
    • 2020-06-20
    • 2017-03-10
    相关资源
    最近更新 更多