首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量动态分配问题

向量动态分配问题
EN

Stack Overflow用户
提问于 2021-12-03 20:38:22
回答 2查看 77关注 0票数 0
代码语言:javascript
复制
#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;
}

我试图在最后一个向量的最内部维度中动态分配一个列表,但是当我试图为该向量设置一个值时,它会抛出一些编译错误:

'__gnu_cxx::__alloc_traits,错误:从'int‘到

int*>::value_type’{aka 'int*'} -fpermissive

的转换无效

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-03 21:24:44

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

代码语言:javascript
复制
storage[i][j][k]=k;

storage[i][j][k]返回(对) int*的引用,但kint

由于您有三个级别的向量包含一个int[]数组,所以需要4个循环来初始化单个int,但是只有3个循环,所以添加另一个循环:

代码语言:javascript
复制
#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;
}

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

代码语言:javascript
复制
#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;
}
票数 1
EN

Stack Overflow用户

发布于 2021-12-03 20:42:36

我假设您试图索引到C样式的数组中,在这种情况下,您必须删除向量的一个维度,如下所示:

代码语言:javascript
复制
vector<vector<int*>> storage;

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

storage[i][j]当前访问一个vector of int*,其中您只按了一个元素。但是,如果希望保持代码的其余部分不变,只需执行storage[i][j][0][k]=k,我建议移除维度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70220404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档