使用 stdvector 擴充套件動態大小陣列

// Example of std::vector as an expanding dynamic size array.
#include <algorithm>            // std::sort
#include <iostream>
#include <vector>               // std::vector
using namespace std;

int int_from( std::istream& in ) { int x = 0; in >> x; return x; }

int main()
{
    cout << "Sorting integers provided by you.\n";
    cout << "You can indicate EOF via F6 in Windows or Ctrl+D in Unix-land.\n";
    vector<int> a;      // ← Zero size by default.

    while( cin )
    {
        cout << "One number, please, or indicate EOF: ";
        int const x = int_from( cin );
        if( !cin.fail() ) { a.push_back( x ); }  // Expands as necessary.
    }

    sort( a.begin(), a.end() );
    int const n = a.size();
    for( int i = 0; i < n; ++i ) { cout << a[i] << ' '; }
    cout << '\n';
}

std::vector 是一個標準的庫類别範本,它提供了可變大小陣列的概念。它負責所有記憶體管理,緩衝區是連續的,因此指向緩衝區的指標(例如 &v[0]v.data())可以傳遞給需要原始陣列的 API 函式。通過例如附加專案的 push_back 成員函式,甚至可以在執行時擴充套件 vector

n push_back 操作序列的複雜性,包括向量擴充套件中涉及的複製或移動,是攤銷 O( n )。 攤銷:平均而言。

在內部,這通常通過向量加倍其緩衝區大小及其容量來實現,當需要更大的緩衝區時。例如,對於從大小為 1 開始的緩衝區,並且根據需要對 n = 17 個 push_back 呼叫重複加倍,這涉及 1 + 2 + 4 + 8 + 16 = 31 次複製操作,小於 2× n = 34。更一般地,該序​​列的總和不能超過 2× n

與動態大小原始陣列示例相比,這種基於 vector 的程式碼不需要使用者提供(並且知道)預先的專案數量。相反,對於使用者指定的每個新專案值,僅根據需要擴充套件向量。