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ách | Code | Ghi chú |
|---|---|---|
| Initializer list | vector<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/Move | vector<int> v2 = v1; | Deep copy |
| Fill constructor | vector<int> v(5); v.assign(5, 10); | Gán sau khi tạo |
| C++20: from_range | vector 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 khipush_backtrong 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