int b, c, d;
cin >>b>>c>>d;
int **a[b];
for(int i=0;i<b;++i){
*a[i]=new int[c];
for(int j=0;j<c;j++){
a[i][j]=new int[d];
}
}
我想創建一個3維int.I認爲問題是當我創建第二個維度時,它不是一個指針,我無法創建第3個維度。如何用C++中的指針創建3維int?
int b, c, d;
cin >>b>>c>>d;
int **a[b];
for(int i=0;i<b;++i){
*a[i]=new int[c];
for(int j=0;j<c;j++){
a[i][j]=new int[d];
}
}
我想創建一個3維int.I認爲問題是當我創建第二個維度時,它不是一個指針,我無法創建第3個維度。如何用C++中的指針創建3維int?
正如@yacsha發佈,你最好使用STL的<vector>
,而不是使用原始指針和new
(甚至是指針)。
但是,如果創造一個「3維INT」真的是你想要的,那麼你必須正確地聲明變量,分配什麼,然後將其刪除:
#include <iostream>
int main()
{
int b, c, d;
std::cin >> b >> c >> d;
// declaring a variable to a pointer that points to a pointer ... etc.
// really hard to maintain and read
int*** a = new int**[b];
for (int i = 0; i < b; ++i) {
a[i] = new int*[c];
for (int j = 0; j < c; j++) {
a[i][j] = new int[d];
for (int k = 0; k < d; k++)
std::cin >> a[i][j][k];
}
}
// using it like a normal 3d array would be used
for (int i = 0; i < b; i++) {
for (int j = 0; j < c; j++) {
for (int k = 0; k < d; k++)
std::cout << a[i][j][k] << ' ';
std::cout << '\n';
}
std::cout << '\n';
}
// deleting is necessary after using them
for (int i = 0; i < b; i++)
for (int j = 0; j < c; j++)
delete[] a[i][j];
for (int i = 0; i < b; i++)
delete[] a[i];
delete[] a;
}
正如你所看到的,這是一場噩夢保持。使用<vector>
要容易得多,因爲容器負責爲你分配內存。如果您不想使用STL,至少使用a[b][c][d]
,其中b
,c
,d
是const
/constexpr
。
這是怎麼看起來像<vector>
:
#include <iostream>
#include <vector>
int main()
{
int b, c, d;
std::cin >> b >> c >> d;
std::vector<std::vector<std::vector<int>>> threeDim(b, std::vector<std::vector<int>>(c, std::vector<int>(d, 0)));
for (const auto x : threeDim) {
for (const auto y : x) {
for (const auto z : y)
std::cout << z << ' ';
std::cout << '\n';
}
std::cout << '\n';
}
}
你可以typedef
/using
縮短std::vector
如果你覺得太麻煩了聲明和初始化的三維陣列,或者您也可以通過循環調整其大小。
您可以將a
聲明爲***a[b]
(指向指向指針的指針)。
int ***a[b];
通過這樣做你可以超越併成爲[三星程序員](http://wiki.c2.com/?ThreeStarProgrammer) –
這個答案的落後者請解釋他們的downvote?我回答了問題。是的,我也認爲使用tripple-pointers是愚蠢的,但我不明白爲什麼這是一個downvote。 –
我建議使用標準STL,這比使用指針更安全,所以我必須申報「矢量模板」:
#include <vector>
using std::vector;
的代碼是這樣:
vector<vector<vector<int>>> A;
int b, c, d;
cin >>b>>c>>d;
int i,j,k;
A.resize(b);
for(i=0;i<b;++i){
A[i].resize(c);
for(j=0;j<c;j++){
A[i][j].resize(d);
for(k=0;k<d;k++){
// Optional inputs elements
cout << "Input element " <<i<<","<<j<<","<<k<<": ";
cin >> A[i][j][k];
}
}
}
通常使用由單維數組支持的專用類更好。查找「傻矩陣」,然後將代碼擴展到3D。 – o11c