在 C++ 中複製向量容器物件

Jinku Hu 2023年1月30日 2021年6月28日
  1. 在 C++ 中使用初始化列表表示法複製向量容器物件
  2. 在 C++ 中使用 std::copy 演算法複製向量容器物件
  3. 在 C++ 中使用複製賦值運算子複製向量容器物件
  4. 在 C++ 中使用複製建構函式複製向量容器物件
  5. 使用 assign 成員函式在 C++ 中複製向量容器物件
在 C++ 中複製向量容器物件

本文解釋瞭如何在 C++ 中複製 std::vector 容器物件的幾種方法。

在 C++ 中使用初始化列表表示法複製向量容器物件

std::vector 是 STL 容器庫中提供的核心資料結構。它實現了連續儲存的動態大小的陣列元素。當使用者從陣列中新增或刪除元素時,記憶體管理會自動完成。在構造 std::vector 型別的新變數時,我們可以使用初始化列表符號製作向量物件的副本。請注意,我們只需要傳遞需要複製到新物件中的原始向量物件的 beginend 迭代器。使用相同的表示法,你可以通過將相應的迭代器指定為大括號中的引數來提取物件的任何子向量。

#include <iostream>
#include <vector>

using std::cout; using std::endl;
using std::vector; using std::copy;

template<typename T>
void printVector(std::vector<T> v) {
    for (const auto &item : v) {
        cout << item << "; ";
    }
    cout << endl;
}

int main() {
    vector<int> vec1 = { 23, 43, 324, 222,
                           649, 102, 40, 304};

    vector<int> vec1_c = {vec1.begin(), vec1.end()};
    vector<int> vec1_cc = {vec1.begin(), vec1.end()-4};

    printVector(vec1_c);
    printVector(vec1_cc);

    return EXIT_SUCCESS;
}

輸出:

23; 43; 324; 222; 649; 102; 40; 304;
23; 43; 324; 222;

在 C++ 中使用 std::copy 演算法複製向量容器物件

複製 std::vector 物件的另一種方法是從 STL 演算法庫中呼叫 std::copy 函式。它為基於範圍的物件提供通用複製操作。該函式有多個過載,但以下程式碼片段中使用的過載需要三個迭代器引數。前兩個指定原始向量範圍,而第三個迭代器指示目標向量範圍的開始。

#include <iostream>
#include <vector>

using std::cout; using std::endl;
using std::vector; using std::copy;

template<typename T>
void printVector(std::vector<T> v) {
    for (const auto &item : v) {
        cout << item << "; ";
    }
    cout << endl;
}

int main() {
    vector<int> vec1 = { 23, 43, 324, 222,
                           649, 102, 40, 304};

    vector<int> vec1_c(vec1.size());
    copy(vec1.begin(), vec1.end(), vec1_c.begin());
    printVector(vec1_c);

    return EXIT_SUCCESS;
}

輸出:

23; 43; 324; 222; 649; 102; 40; 304;

在 C++ 中使用複製賦值運算子複製向量容器物件

或者,你可以使用複製賦值運算子來複制 std::vector 容器物件的內容。這個符號是這個問題最簡潔的解決方案。我們只需要將原始向量的變數賦值給新宣告的向量物件即可。

#include <iostream>
#include <vector>

using std::cout; using std::endl;
using std::vector; using std::copy;

template<typename T>
void printVector(std::vector<T> v) {
    for (const auto &item : v) {
        cout << item << "; ";
    }
    cout << endl;
}

int main() {
    vector<int> vec1 = { 23, 43, 324, 222,
                           649, 102, 40, 304};

    vector<int> vec1_c = vec1;
    printVector(vec1_c);

    return EXIT_SUCCESS;
}

輸出:

23; 43; 324; 222; 649; 102; 40; 304;

在 C++ 中使用複製建構函式複製向量容器物件

另一方面,std::vector 類的複製建構函式提供了一種類似的方法來將向量複製到新宣告的向量物件中。在這種情況下,我們需要在宣告新建立的向量變數時將原始向量的變數傳遞到括號中。

#include <iostream>
#include <vector>

using std::cout; using std::endl;
using std::vector; using std::copy;

template<typename T>
void printVector(std::vector<T> v) {
    for (const auto &item : v) {
        cout << item << "; ";
    }
    cout << endl;
}

int main() {
    vector<int> vec1 = { 23, 43, 324, 222,
                           649, 102, 40, 304};

    vector<int> vec1_c(vec1);
    printVector(vec1_c);

    return EXIT_SUCCESS;
}

輸出:

23; 43; 324; 222; 649; 102; 40; 304;

使用 assign 成員函式在 C++ 中複製向量容器物件

std::vector 容器提供了 assign 成員函式,你可以利用該函式將一個向量物件的內容替換為另一個向量的元素。請注意,我們可以初始化一個空的 vector 容器,然後從物件呼叫 assign 函式來複制另一個 vector 的內容。

#include <iostream>
#include <vector>

using std::cout; using std::endl;
using std::vector; using std::copy;

template<typename T>
void printVector(std::vector<T> v) {
    for (const auto &item : v) {
        cout << item << "; ";
    }
    cout << endl;
}

int main() {
    vector<int> vec1 = { 23, 43, 324, 222,
                           649, 102, 40, 304};

    vector<int> vec1_c;
    vec1_c.assign(vec1.begin(), vec1.end());
    printVector(vec1_c);

    return EXIT_SUCCESS;
}

輸出:

23; 43; 324; 222; 649; 102; 40; 304;
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Vector