C++中如何創建一個不定長數組的數組指針?
假設我有若干二維數組,其第一維不定長
int p1[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
int p2[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
int p3[][4] = {{1, 2, 3, 4}, {4, 3, 2, 1}, {8, 7, 6, 5}};
int p4[][4] = {{1, 2, 3, 4}, {2, 2, 3, 4}, {3, 2, 3, 4}};
int p5[][4] = {{1, 2, 3, 4}};
然後我希望有一個數組指針指向這些二維數組
第一個想法
// 但是會報無法將int*[4] 轉換為 int**的錯誤
int (**p)[] = {p1, p2, p3, p4, p5};
第二個想法
// 會報excess elements in initializer的錯誤
int ((*p)[4])[3] = {p1, p2, p3, p4, p5};
所以我想得到一個由p1, p2, p3, p4, p5組成的數組該怎麼寫?
using ar_int_4 = int[4];using p_ar_int_4 = ar_int_4*;p_ar_int_4 ptrarr[] = { p1, p2, p3, p4, p5 };或(盡量不要試圖寫這種,容易錯)int (*ptrarr[])[4] = { p1, p2, p3, p4, p5 };
在C++裡面試圖用C的方法解決問題是不行的。
最好的辦法就是using namespace std;vector&
vec.size
vec[0].size這樣瀉藥,就像大家說的,用vector,list,set等等等等。在C++里,我基本上也沒怎麼用過數組了,就算用,也都是一維的,太容易出錯了。
在C#、Java里才會用一部分數組,畢竟人家封裝的好。
謝邀。
我本人也是非常討厭數組語法的。所以最近實現C編譯器的時候就故意刪掉了數組2333...
如果一定要用數組,那麼你可以像其他幾位答主所說的那樣用decltype之類的做法。不過最好能配合類型別名來使用。
如果不是非用數組不可的話,那就總std::array吧。std::vector也可以(不過會產生堆分配)。手機碼字,實例晚上來補。decltype(p1[0]) *p[] ={p1, p2, p3, p4, p5};
std::liststd::vector
其實只要理清層級關係就行了,
你需要的是一個數組,數組的元素是指針,指針指向的是一個長度為4個int的一維數組,所以你需要將p定義成這樣的類型:array(pointer(array(int, 4)), unknown),直接展開到C的類型就是int (*(p[]))[4] = {p1, p2, p3, p4, p5}; 同時由於[]的結合優先順序大於*,你可以將最裡面的那個括弧省略,也就是可以寫成int (*p[])[4] = {p1, p2, p3, p4, p5};
按照 C 的寫法應該是:
int (*p[])[4] = {p1, p2, p3, p4, p5};
但是既然是用 C++ ,最好的方法還是用模板容器:
using arr_type = std::vector&
arr_type p1 = {{1, 2, 3, 4}, {5, 6, 7, 8}};
arr_type p2 = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
arr_type p3 = {{1, 2, 3, 4}, {4, 3, 2, 1}, {8, 7, 6, 5}};
arr_type p4 = {{1, 2, 3, 4}, {2, 2, 3, 4}, {3, 2, 3, 4}};
arr_type p5 = {{1, 2, 3, 4}};
然後想要拷貝
std::vector& p = {p1, p2, p3, p4, p5};
或者想用指針
std::vector& p = {p1, p2, p3, p4, p5};
都可以。
歪個樓,可以參考boost的ptr_vector
std::vector&
其實有個最簡單的寫法,就是用string,string本身就是個不定長數組。要多維就加入容器就好了
template&
using unique_ptr_vector = std::unique_ptr&
std::vector&
其實就是要一個存這些數組退化成指針後的值的數組……
所以得退化一下……
#include &
// ...
// C++ 11
std::decay&
// or C++ 14
std::decay_t&
或者把它置於右值上下文來退化(加減幾都行)
// C++ 11
decltype(p1 + 0) arr[] = { p1, p2, p3, p4, p5 };
當然最後的實際類型是
int (*arr[5])[4];
std::vector&
推薦閱讀:
※為什麼 C 語言的輸入輸出函數比 C++ 的輸入輸出流要快?
※有沒有比較好的自學IT的網站?適用於不管是初學者還是其他段位的程序猿的網站?
※如何評價2016年藍橋杯決賽?
※C++ 是否適合做 GUI?