关于向量中动态分配的问题
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 个循环来初始化各个 int
s,但你只有 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;
}
#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 个循环来初始化各个 int
s,但你只有 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;
}