網頁

2022/7/20

C++ vector基本用法

c++標準函式庫的std::vector基本用法如下。


Vector可以看作是array的加強版,一樣以連續的記憶體空間儲存多個有序的元素;長度是可動態增長的;支援泛型,即可儲存任意型態的元素。讀取為隨機存取時間複雜度O(1);新增刪除時間複雜度O(n)

範例環境:

  • macOS BigSur vesion 11.4
  • Apple clang version 12.0.0

使用vector要匯入標頭檔vector,所在的命名空間為std。例如下面宣告一個vector變數v

main.cpp

#include <vector>
using namespace std;

int main() {
    vector<int> v;

    return 0;
}

或在宣告時設定元素,不過此語法要C++11以上編譯。

main.cpp

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v = {1, 2, 3};

    return 0;
}

vector可使用push_back()將資料放在尾端。

main.cpp

#include <vector>

using namespace std;

int main() {
    vector<int> v;  // {}
    v.push_back(1); // {1}
    v.push_back(2); // {1, 2}
    v.push_back(3); // {1, 2, 3}

    return 0;
}

使用size()取得元素個數。

main.cpp

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);

    cout << v.size() << endl; // 3

    return 0;
}

可以方括弧[]以索引取得元素;或用方法at()以索引取得元素,差別在會做邊界檢查,若索引超過範圍會拋出out_of_range錯誤。

main.cpp

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);

    cout << v[0] << endl;      // 1
    cout << v.at(1) << endl;   // 2

    cout << v[100] << endl;    // 0
    cout << v.at(100) << endl; // terminating with uncaught exception of type std::out_of_range: vector

    return 0;
}

使用empty()檢查vector是否為空。

main.cpp

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);

    cout << v.empty() << endl; // 0 (false)

    return 0;
}

使用clear()清空內容。

main.cpp

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);

    v.clear();

    cout << v.empty() << endl; // 1 (true)

    return 0;
}

使用pop_back移除尾端的元素。

main.cpp

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);

    v.pop_back();

    cout << v.size() << endl; // 2

    return 0;
}

使用for loop迴圈遍歷vector。

main.cpp

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);

    for (int i = 0; i < v.size() ; i++) {
        cout << v[i] << endl;
    }

    return 0;
}

或用C++ 11才有的Range-based for loop

main.cpp

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);

    for(auto &e : v) {
        cout << e << endl;
    }

    return 0;
}

執行印出以下:

1
2
3



沒有留言:

張貼留言