Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Khởi tạo std::vector với phần tử hardcoded trong C++ hiện đại

C++11 giới thiệu initializer list – cách ngắn gọn, an toàn, hiệu quả để khởi tạo vector với giá trị cố định.

Cú pháp chuẩn (C++11)

std::vector<int> vec = {1, 2, 3};     // copy-list-initialization
std::vector<int> vec {1, 2, 3};       // direct-list-initialization (ưu tiên)
std::vector<int> vec{1, 2, 3};        // uniform initialization

Ví dụ đầy đủ: Tính tổng vector

#include <iostream>
#include <vector>
#include <numeric> // accumulate
using namespace std;

int main() {
    vector<int> v = {2, 7, 6, 10}; // C++11 initializer list
    cout << "Sum: " << accumulate(v.begin(), v.end(), 0) << endl; // 25
    return 0;
}

Kết quả

Sum: 25

Các cách khởi tạo vector khác

CáchCodeGhi chú
Initializer listvector<int> v = {1,2,3};C++11, phổ biến nhất
Constructor (n, val)vector<int> v(5, 0);5 phần tử giá trị 0
Constructor (range)vector<int> v(arr, arr+n);Từ mảng C / iterator khác
Copy/Movevector<int> v2 = v1;Deep copy
Fill constructorvector<int> v(5); v.assign(5, 10);Gán sau khi tạo
C++20: from_rangevector v = std::views::iota(1, 6) | std::ranges::to<vector>();Range adapter

Lưu ý hiệu năng

  • Initializer list tạo array tạm trên stack → copy vào vector (1 allocation).
  • Với số lượng lớn phần tử compile-time-known, cân nhắc std::array (stack, zero overhead).
  • reserve(n) trước khi push_back trong loop tránh reallocate.

Ví dụ phức tạp hơn

struct Point { int x, y; };
vector<Point> points = {{1,2}, {3,4}, {5,6}}; // aggregate init (C++11)
vector<string> names = {"Alice", "Bob", "Charlie"}; // string từ literal