vector::insert() chèn phần tử mới trước vị trí chỉ định bằng iterator, mở rộng kích thước vector. Có 3 dạng nạp chồng chính.
3 Cú pháp chính
// 1. Chèn 1 giá trị tại vị trí pos iterator insert(const_iterator pos, const T& value); // 2. Chèn n bản sao của value tại pos iterator insert(const_iterator pos, size_type n, const T& value); // 3. Chèn dãy từ [first, last) tại pos template<class InputIt> iterator insert(const_iterator pos, InputIt first, InputIt last);
Trả về iterator trỏ đến phần tử đầu tiên được chèn (hoặc pos nếu chèn 0 phần tử).
Ví dụ minh họa 3 dạng
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {50, 60, 70, 80, 90};
vector<int>::iterator it;
// 1. Chèn 1 giá trị ở đầu
it = v.insert(v.begin(), 40); // {40, 50, 60, 70, 80, 90}
// 2. Chèn n bản sao (1 bản sao giá trị 30) ở đầu
it = v.insert(v.begin(), 1, 30); // {30, 40, 50, 60, 70, 80, 90}
cout << "Vector 1: ";
for (it = v.begin(); it != v.end(); ++it) cout << *it << ' ';
cout << endl;
// 3. Chèn toàn bộ v vào v2 (rỗng) tại begin()
vector<int> v2;
v2.insert(v2.begin(), v.begin(), v.end()); // copy all
cout << "Vector 2: ";
for (it = v2.begin(); it != v2.end(); ++it) cout << *it << ' ';
cout << endl;
return 0;
}
Kết quả
Vector 1: 30 40 50 60 70 80 90 Vector 2: 30 40 50 60 70 80 90
Độ phức tạp
- Chèn 1 phần tử: O(N) trung bình (dịch chuyển các phần tử sau).
- Chèn n phần tử: O(N + n).
- Có thể gây reallocation (cấp phát bộ nhớ mới, copy toàn bộ) nếu
size() + n > capacity()– tất cả iterator, pointer, reference trở nên invalid.
Mẹo tối ưu
- Dùng
reserve()trước khi chèn nhiều để tránh reallocation lặp. - Chèn cuối:
push_back()/emplace_back()nhanh hơn (amortized O(1)). - C++11:
emplace()xây dựng trực tiếp đối tượng tại chỗ, tránh copy/move tạm.
Ví dụ emplace (C++11)
struct Point { int x, y; Point(int a, int b) : x(a), y(b) {} };
vector<Point> vp;
vp.emplace(vp.begin(), 10, 20); // Tạo Point(10,20) ngay tại begin(), không tạo tạm