C++Arrays,std::array,std::vectorまとめ

2761 ワード

原文:https://shendrick.net/Coding%20Tips/2015/03/15/cpparrayvsvector.html @Seth Hendrick Original article: https://shendrick.net/Coding%20Tips/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 

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

2つ目の例では、関数は正しい配列サイズを返す.これは、配列が入力パラメータであるときに入るsize_tの大きさのポインタであり、具体的な機械では8バイトの大きさである可能性があり、intのタイプの大きさは4バイトであるため、第2の例は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 

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 
#include 

void printElements(const std::array &someArray) {
    for (const int &i : someArray) {
        std::cout << i << ", " << std::endl;
    }

    std::cout << "Size: " << someArray.size() << std::endl;
}

int main() {
    std::array 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];