原文來自: https://shendrick.net/Coding Tips/2015/03/15/cpparrayvsvector.html @Seth Hendrick
Original article: https://shendrick.net/Coding Tips/2015/03/15/cpparrayvsvector.html @Seth Hendrick
C-Style 數組
賦值
int myArray[3] = {1, 2, 3};
數組與指針
a[1]
等價於*(a+1)
std::cout << std::boolalpha << (myArray[0] == *myArray) << std::endl;
std::cout << std::boolalpha << (myArray[1] == *(myArray + 1) << std::endl;
// Outputs:
// true
// true
數組大小
int myArray[5] = {1, 2, 3, 4, 5};
size_t arraySize = sizeof(myArray) / sizeof(int);
std::cout << "C-style array size: " << arraySize << std::endl;
// Outputs:
// C-style array size: 5
#include <iostream>
void printSize(int someArray[5]) {
std::cout << sizeof(someArray)/sizeof(int) << std::endl;
}
int main() {
int myArray[5] = {1, 2, 3, 4, 5};
printSize(myArray);
}
// Outputs:
// 2
第二個例子中, 函數沒有返回正確的數組大小. 這是因為數組作為輸入參數時, 傳入的是一個size_t
大小的指針, 在具體機器上大小可能為8字節, 而int
類型大小是4個字節, 因為第二個例子相當於sizeof(size_t) / sizeof(int)
, 輸出結果為2.
遍歷循環
與上面一個小節類似, 在同一個作用范圍內, 數組可以用C++11的遍歷循環,
int main() {
int myArray[5] = {1, 2, 3, 4, 5};
for (int &i : myArray) {
std::cout << i << ", " << std::endl;
}
}
但是當數組被傳入其他函數作為變量時, 遍歷循環失效
#include <iostream>
void printElements(int someArray[5]) {
for (int &i : someArray) {
std::cout << i << ", " << std::endl;
}
}
int main() {
int myArray[5] = {1, 2, 3, 4, 5};
printElements(myArray);
}
原因還是一樣, 被傳入的是指針.
std::array
std::array
是一個包裝后的C數組, 在編譯的時候必須確定數組大小.
聲明數組
#include <array>
#include <iostream>
void printElements(const std::array<int, 5> &someArray) {
for (const int &i : someArray) {
std::cout << i << ", " << std::endl;
}
std::cout << "Size: " << someArray.size() << std::endl;
}
int main() {
std::array<int, 5> myArray = {1, 2, 3, 4, 5};
printElements(myArray);
}
// Outputs:
// 1,
// 2,
// 3,
// 4,
// 5,
// Size: 5
std::vector
std::array
是C數組的封裝, std::vector
則完全不同於原來的C數組, 是heap
上的動態數組, 數組大小在編譯的時候可以不確定.
std::array
可以看成如此封裝
int a[5];
std::vector
則是
int *a = net int[5];