C++ Arrays, std::array, std::vector 總結


原文來自: 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];


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM