如何使用new運算符編寫以下代碼? 請詳細解釋。 在此先感謝。將malloc轉換爲新的
#include<alloc>
#define MAXROW 3
#define MAXCOL 5
using namespace std;
int main()
{
int (*p)[MAXCOL];
p = (int(*)[MAXCOL])malloc(MAXROW*sizeof(*p));
}
如何使用new運算符編寫以下代碼? 請詳細解釋。 在此先感謝。將malloc轉換爲新的
#include<alloc>
#define MAXROW 3
#define MAXCOL 5
using namespace std;
int main()
{
int (*p)[MAXCOL];
p = (int(*)[MAXCOL])malloc(MAXROW*sizeof(*p));
}
很簡單,回答字面上的問題:
p = new int[MAXROW][MAXCOL];
此分配的自由存儲區和一個二維數組(由MAXCOL MaxRow的),像往常一樣new
,返回int(*)[MAXCOL]
- 與衰減2D陣列相同的類型。別忘了delete[] p;
。
最後一部分提出了std::vector
的重要性。據推測,你在編譯時知道第二維的大小。因此,std::vector<std::array<int, MAXCOL>>
將與不需要delete[]
聲明的額外獎勵一起使用,並知道其大小(MAXROW)。如果可能的話請使用這個。
事實上,在你的例子中,兩個維度在編譯時已知,這意味着std::array<std::array<int, MAXCOL>, MAXROW>
也可以在這裏工作。這通常比動態分配更可取。
如果在編譯時都不知道維度,那麼當您知道每個內部向量的大小相同時,您最好的選擇通常是向量或專用矩陣類的向量來提高性能。
字面問題
」如何編寫使用new運算符下面的代碼?
&hellip;意味着別的東西比你認爲的意思。
的new
操作者是一個簡單分配的功能大致直接類似於C中的malloc
,除C++ new
操作者是可更換的由用戶定義的一個。
您可能的意思是new
表達式。這樣的表達式調用new
運算符進行分配,然後和然後調用構造函數進行初始化,如果分配的東西是類類型的話。它是安全的。
儘管如此,對於你的陣列,你也不想那麼做,只是從標準庫中只需要std::vector
。
下面是使用向量的std::vector
創建一個矩陣的例子:
#include <vector>
using namespace std;
auto main()
-> int
{
int const n_rows = 3;
int const n_cols = 5;
using Row = vector<int>;
vector<Row> v(n_rows, Row(n_cols));
// E.g. v[1] is a row, and v[1][2] is an int item in that row.
}
即使你不經常使用的矩陣,它可以是包裹是一個好主意矩陣的一般概念,在一個類中。一種簡單的方法是使用單個std::vector
進行存儲,並提供例如一個at
函數或一個operator()
從客戶端代碼索引。如果您還不想自己做這個,那麼例如Boost庫提供了一個矩陣類。
通常,我避免使用像對象一樣的N-dim數組的嵌套向量。有多個indirections訪問一個元素會減慢速度。 – doug
@doug:我同意。這就是爲什麼我建議使用單個矢量作爲矩陣存儲。簡單的聲明是嵌套的原因。 (順便說一下,我發現沒有人對明顯的錯字發表評論,這真是太神奇了:)修正:) :) –
有一種非常簡單的方法來使用單個向量,並仍然使用數組中的2D語義。 (http://stackoverflow.com/questions/36123452/statically-declared-2-d-array-c-as-data-member-of-a-class/36123944#36123944) – doug
由於這是C++,我會建議更換使用std::array
和使用malloc
時,你應該使用free
未頁頭或釋放內存,如果使用new
你需要使用delete
std::unique_ptr
也;如果你new[]
你需要使用delete[]
#include <cstdlib>
#include <memory>
#include <array>
#define MAXROW 3
#define MAXCOL 5
using namespace std;
int main()
{
int (*p)[MAXCOL];
p = (int(*)[MAXCOL])malloc(MAXROW*sizeof(*p));
free(p); //free memory
array<int,MAXCOL> *p1 = new array<int,MAXCOL>[MAXROW];
delete []p1; //use this to delete the variable
array<array<int,MAXCOL>,MAXROW> *p2 = new array<array<int,MAXCOL>,MAXROW>;
delete p2; // normal delete for this one
auto p3 = make_unique<array<array<int,MAXCOL>,MAXROW>>();
//no delete needed for p3, it is a smart pointer.
}
請注意''不是標準標題。對於'malloc',使用''。 –
chris