C語(yǔ)言數(shù)組的不便之處就是求數(shù)組的長(zhǎng)度麻煩蓖柔。
對(duì)于一個(gè)數(shù)組int arr[10];
辰企,一般都這樣求長(zhǎng)度sizeof(arr) / sizeof(arr[0])
风纠。但是這里有兩個(gè)麻煩不方便的地方是况鸣。
-
如果重構(gòu)代碼的時(shí)候把靜態(tài)分配的數(shù)組改成了一個(gè)動(dòng)態(tài)分配的數(shù)組,而忘記修改
sizeof(arr) / sizeof(arr[0])
了竹观。那么程序就出錯(cuò)了镐捧,編譯器沒(méi)有辦法檢查出這個(gè)錯(cuò)誤潜索。比如,下面的代碼懂酱。void foo(){ //int arr[10]; int *arr = new int[10]; // for some reason, now use new to alloc array. int len = sizeof(arr) / sizeof(arr[0]); // still valid in compiler }
-
數(shù)組在作為函數(shù)參數(shù)的時(shí)候竹习,其實(shí)退化成指針了,丟失長(zhǎng)度信息了列牺。比如下面的代碼整陌。
void foo(int arr[10]){ /* sizeof on array function parameter will return size of 'int *' instead of 'int [10]*/ std::cout << sizeof(arr) << std::endl; } void bar(){ int arr[9]; foo(arr); }
std::array的一些局限。
std::array基本上都能代替原來(lái)的數(shù)組了瞎领。它的size不會(huì)丟失了泌辫,它是個(gè)std的容器了,它可以直接用=
賦值了九默。
void foo(std::array<int, 10> arr){
int len = arr.size();
std::array<int, 10> k = arr;
k = arr;
for (auto m : arr){
std::cout << m;
};
}
當(dāng)然std::array也有一些局限震放,比如說(shuō)int arr[]={1,2,3,4};
這個(gè)依靠初始化列表里面的元素來(lái)決定大小的方式std::array沒(méi)辦法實(shí)現(xiàn)。
還有就是在調(diào)試的時(shí)候驼修,查看std::array里面的內(nèi)容會(huì)稍微麻煩一點(diǎn)殿遂。如下例,沒(méi)法直接用std_arr[2]
來(lái)查看里面的值了乙各。這在數(shù)組很大的時(shí)候不是特別方便墨礁。
解決方法是展開(kāi)std_arr
,然后選中其中的一個(gè)元素Add Watch耳峦。然后就可以隨便修改[]
里面的值來(lái)看你想看的東西了饵溅。比如說(shuō)我改成了1000也沒(méi)有關(guān)系(((&(std_arr)))->_Elems)[1000]
,這是在調(diào)試器里面妇萄,不受C++的限制蜕企。