所以我有這個 3 維陣列,看起來像這樣:
int map[100][100][100];
我想將它用作函式的回傳型別,無論是作為指標還是類似的東西:
int* World::CreateCell() {
int map[100][100][100];
return map;
}
但是,我找不到 3d 陣列的適當回傳型別,它不會讓我像使用 2D 陣列那樣使用 int*。
即使這樣的事情也不起作用:
int a[100][100][100];
int* b = a;
VS 似乎認為資料型別是,int*(100)(100)但這沒有意義并且不起作用。
對于它的價值,我已經用谷歌搜索了這個并沒有看到任何解決方案。謝謝
uj5u.com熱心網友回復:
首先你應該
永遠不要回傳指向區域非靜態變數的參考或指標。
現在來回答你的問題:
我想將它用作函式的回傳型別,無論是作為指標還是其他類似的東西。但是我找不到 3d 陣列的適當回傳型別。
這(下面)是您如何為 3D 陣列執行此操作。基本上有兩種方法可以解決這個問題:
方法一
//CreateCell is a function that returns a pointer to a 3D array of the size 100,100,100
int (*CreateCell())[100][100][100] {
int map[100][100][100];
return ↦
}
方法 1 可以在這里看到。
方法二
//CreateCell is a function that returns a pointer to a 3D array of the size 100,100,100
auto CreateCell() -> int(*)[100][100][100] {
int map[100][100][100];
return ↦
}
方法 2 使用尾隨回傳型別并按此處所示作業。
筆記
這兩種方法都回傳一個指向必須避免的區域變數的指標。我已經給出/寫了答案,以便您可以看到如何根據需要回傳 3D 陣列的指標。您可以改為按值創建和回傳 3D `std::vector`。uj5u.com熱心網友回復:
既然你想要 3D C 風格的陣列,你需要有一個指向一個指標的指標,即int***. 另外,如果使用這樣的創建函式,則需要分配記憶體。否則,您將從該函式回傳靜態分配的記憶體。
以下是如何執行此操作的快速示例:
#include <iostream>
static int*** create_cell() {
constexpr std::size_t n = 100;
int*** map = new int**[n];
for (std::size_t i = 0u; i < n; i) {
map[i] = new int*[n];
for (std::size_t j = 0u; j < n; j) {
map[i][j] = new int[n];
}
}
return map;
}
static void delete_cell(int***& map) {
constexpr std::size_t n = 100;
for (std::size_t i = 0u; i < n; i) {
for (std::size_t j = 0u; j < n; j) {
delete[] map[i][j];
}
delete[] map[i];
}
delete[] map;
}
int main()
{
int*** a = create_cell();
a[0][0][0] = 1;
std::cout << "a[0][0][0] = " << a[0][0][0] << std::endl;
delete_cell(a);
return 0;
}
這取決于您的用例:但是對于現代 C ,您可以使用stl諸如std::vector和之類的容器來簡化您的生活std::array。在此處查看參考:std::array和std::vector
例如,您可以定義 3D 型別:
#include <array>
#include <vector>
using vector_3d = std::vector<std::vector<std::vector<int>>>;
using array_3d = std::array<std::array<std::array<int, 100>, 100>, 100>;
然后將它們用作:
array_3d b;
b[0][0][0] = 1;
std::cout << "b[0][0][0] = " << b[0][0][0] << std::endl;
uj5u.com熱心網友回復:
考慮在矩陣周圍使用一個簡單的包裝器:
struct Wrapper { int Mat[100][100][100] = {0}; };
然后簽名會變成這樣:
Wrapper *foo(...) { ... }
這是簡單的作業示例:
#include <iostream>
struct Wrapper { int Mat[100][100][100] = {0}; };
Wrapper *inc(Wrapper *w)
{
for (int i=0;i<100;i )
for (int j=0;j<100;j )
for (int k=0;k<100;k )
w->Mat[i][j][k] = (i j k);
return w;
}
int main(int argc, char **argv)
{
Wrapper w;
Wrapper *out = inc(&w);
std::cout << out->Mat[5][6][7] << "\n";
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/354272.html
上一篇:將一個串列中的每個專案添加到另一個串列中的每個專案到第三個串列中
下一篇:嗨,伙計們,我如何在反應組件上呈現這些成分而不必寫出“strIngredient1”到“strIngredient20”
