vector::begin() và vector::end() là hai hàm thành viên trả về bidirectional iterator (lặp tiến/lùi), dùng để duyệt vector theo chuẩn STL.
Đặc điểm
begin(): trỏ đến phần tử đầu tiên.end(): trỏ đến vị trí sau phần tử cuối (past-the-end) – không phải phần tử cuối.- Cặp
[begin(), end())đại diện cho toàn bộ phạm vi (half-open range). - Có phiên bản
const:cbegin(),cend()(C++11). - Có phiên bản reverse:
rbegin(),rend().
Ví dụ cơ bản
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {50, 60, 70, 80, 90};
// Chèn ở đầu bằng insert + begin()
v.insert(v.begin(), 40); // {40, 50, 60, 70, 80, 90}
v.insert(v.begin(), 1, 30); // {30, 40, 50, 60, 70, 80, 90}
// Duyệt dùng begin/end
cout << "Vector elements: ";
for (auto it = v.begin(); it != v.end(); ++it)
cout << *it << ' ';
cout << endl;
// Copy sang vector khác dùng range constructor
vector<int> v2(v.begin(), v.end());
cout << "Copied vector: ";
for (auto it = v2.begin(); it != v2.end(); ++it)
cout << *it << ' ';
cout << endl;
return 0;
}
Kết quả
Vector elements: 30 40 50 60 70 80 90 Copied vector: 30 40 50 60 70 80 90
Các mẫu dùng phổ biến
| Mục đích | Code |
|---|---|
| Duyệt đọc | for (auto it = v.cbegin(); it != v.cend(); ++it) |
| Duyệt ghi | for (auto it = v.begin(); it != v.end(); ++it) *it *= 2; |
| Range-based for (C++11) | for (auto& x : v) ... (tự dùng begin/end) |
| Thuật toán STL | sort(v.begin(), v.end()); find(v.begin(), v.end(), val); |
| Chèn/xóa | v.insert(v.begin()+2, 99); v.erase(v.begin()); |
| Duyệt ngược | for (auto it = v.rbegin(); it != v.rend(); ++it) |
Lưu ý quan trọng
- Iterator invalidation:
push_back,insert,erase,resizecó thể làm iterator cũ thành invalid. Không lưu iterator lâu dài qua các thao tác sửa đổi. end()không thể dereference (*end() = UB).- Vector rỗng:
begin() == end().