答案是一切看需求。int num[MAX];這種方式是速度最快的就是在記憶體劃個數據區給你就結束了,但必須在編譯期就知道MAX的具體數值。所以在編譯前無法確定陣列大小就不能用。int *num = new int[n];用new的好處是可以在執行時再確定陣列大小,因此陣列的維度可以用變數代替,但new本身是有成本的,如果被new的元素是個類的話,還會調類的建構函式。而int num[MAX]這種形式僅僅就是在記憶體劃了塊區域而已,成本是最低的,另外new完不要忘記delete,因此鑑於其各種缺點用new構建陣列一般是不合適的,構建單個元素倒是可以。std::vector<int> a(n, 0);其實這種形式才是用的最多的,但在下述情形下int num[MAX];更合適。
1. 在極端注重效能的場合。
2. 陣列維度可確定,或即使不可確定準確大小,也可以確定上限的情況。用vector一定要知道建一個vector的成本,如果是int型別的vector其實和int num[MAX]也沒差多少,但如果是你自己定義的型別,差別就大了,尤其是n很大的情況。std::vector<Class> a(n);的構造方式是先呼叫一次Class類的建構函式,然後呼叫n-1次Class的複製建構函式。如果這兩個函式你定義了什麼複雜操作的話,構造個vector所花的時間可能是直接劃一塊資料區的幾百倍。另外vector還有一個很好用的用法很少被用到,就是std::vector<Class> a;a.reserve(n);reserve這個方法就跟Class a[n]一樣,只是劃了一塊記憶體區沒有調過建構函式因此速度超快。這個原本是為了讓你push_back的時候避免重新分配記憶體的情況,但你是可以直接訪問reserve出的資料區的,意思就是說即使沒有調過建構函式,你也可以直接這麼寫a[n-1].data = 100。但使用這個方法有風險,如果你的Class類中有需要調建構函式的類成員就不能用這個方法。什麼時候能用,就是類中的資料成員全是基本型別和指標的情況,且你可以確保在某個專門的地方將這些資料全部初始化,換言之你定義的其實不是c++的Class,而是c的struct。這麼玩的好處是什麼,就是你既可以獲得與Class a[n]相同的構建速度,又可以在執行時再確定n的大小,同時還能使用vector的各種方法。
答案是一切看需求。int num[MAX];這種方式是速度最快的就是在記憶體劃個數據區給你就結束了,但必須在編譯期就知道MAX的具體數值。所以在編譯前無法確定陣列大小就不能用。int *num = new int[n];用new的好處是可以在執行時再確定陣列大小,因此陣列的維度可以用變數代替,但new本身是有成本的,如果被new的元素是個類的話,還會調類的建構函式。而int num[MAX]這種形式僅僅就是在記憶體劃了塊區域而已,成本是最低的,另外new完不要忘記delete,因此鑑於其各種缺點用new構建陣列一般是不合適的,構建單個元素倒是可以。std::vector<int> a(n, 0);其實這種形式才是用的最多的,但在下述情形下int num[MAX];更合適。
1. 在極端注重效能的場合。
2. 陣列維度可確定,或即使不可確定準確大小,也可以確定上限的情況。用vector一定要知道建一個vector的成本,如果是int型別的vector其實和int num[MAX]也沒差多少,但如果是你自己定義的型別,差別就大了,尤其是n很大的情況。std::vector<Class> a(n);的構造方式是先呼叫一次Class類的建構函式,然後呼叫n-1次Class的複製建構函式。如果這兩個函式你定義了什麼複雜操作的話,構造個vector所花的時間可能是直接劃一塊資料區的幾百倍。另外vector還有一個很好用的用法很少被用到,就是std::vector<Class> a;a.reserve(n);reserve這個方法就跟Class a[n]一樣,只是劃了一塊記憶體區沒有調過建構函式因此速度超快。這個原本是為了讓你push_back的時候避免重新分配記憶體的情況,但你是可以直接訪問reserve出的資料區的,意思就是說即使沒有調過建構函式,你也可以直接這麼寫a[n-1].data = 100。但使用這個方法有風險,如果你的Class類中有需要調建構函式的類成員就不能用這個方法。什麼時候能用,就是類中的資料成員全是基本型別和指標的情況,且你可以確保在某個專門的地方將這些資料全部初始化,換言之你定義的其實不是c++的Class,而是c的struct。這麼玩的好處是什麼,就是你既可以獲得與Class a[n]相同的構建速度,又可以在執行時再確定n的大小,同時還能使用vector的各種方法。