std::vector::insert
#include <vector>
// Phiên bản 1: Chèn một phần tử
iterator insert(const_iterator pos, const value_type& val);
iterator insert(const_iterator pos, value_type&& val); // (since C++11)
// Phiên bản 2: Chèn nhiều phần tử có cùng giá trị
void insert(const_iterator pos, size_type count, const value_type& val);
// Phiên bản 3: Chèn các phần tử từ một phạm vi khác
template <class InputIterator>
void insert(const_iterator pos, InputIterator first, InputIterator last);
// Phiên bản 4: Chèn các phần tử từ một initializer_list (C++11)
iterator insert(const_iterator pos, initializer_list<value_type> ilist);
Chèn một hoặc nhiều phần tử vào vị trí chỉ định trong vector.
Tham số
pos
- Iterator chỉ vị trí trong vector mà bạn muốn chèn phần tử mới.
value
- Giá trị của phần tử cần chèn.
count
- Số lượng phần tử có giá trị
value
sẽ được chèn (áp dụng cho overloadinsert
với tham sốcount
).
first, last
- Phạm vi của các phần tử cần chèn từ một container khác, chỉ định bởi hai iterator
first
vàlast
.
ilist
- Danh sách khởi tạo (initializer list) gồm các phần tử cần chèn.
Giá trị trả về
- Trả về một iterator trỏ tới phần tử đầu tiên vừa được chèn.
Đặc điểm
- Cho phép chèn một phần tử hoặc một dải phần tử từ một vị trí bất kỳ trong vector.
- Sau khi chèn, các phần tử từ vị trí đó trở đi sẽ được dời về phía sau. Kích thước của vector sẽ tăng lên tương ứng với số lượng phần tử được chèn.
- Thời gian thực hiện có độ phức tạp trung bình là
O(n)
, vì có thể cần phải di chuyển các phần tử và cấp phát lại bộ nhớ nếu không đủ dung lượng. - Nếu số lượng phần tử cần chèn lớn, việc sử dụng
insert()
có thể làm giảm hiệu suất, vì phải di chuyển phần tử nhiều lần. - Sau khi gọi
insert()
, tất cả iterator trỏ tới phần tử saupos
có thể bị vô hiệu hóa nếu vector phải cấp phát lại bộ nhớ. - Nếu xảy ra ngoại lệ trong khi chèn, vector sẽ giữ nguyên trạng thái ban đầu.
Ví dụ
Chèn một phần tử
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 4, 5};
auto it = vec.insert(vec.begin() + 2, 3); // Chèn số 3 vào vị trí thứ 2
for (int x : vec) std::cout << x << " "; // Output: 1 2 3 4 5
return 0;
}
Chèn nhiều phần tử có giá trị giống nhau
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 5};
vec.insert(vec.begin() + 2, 3, 4); // Chèn ba số 4 vào vị trí thứ 2
for (int x : vec) std::cout << x << " "; // Output: 1 2 4 4 4 5
return 0;
}
Chèn dải phần tử từ một container khác
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec1 = {1, 2, 5};
std::vector<int> vec2 = {7, 8};
vec1.insert(vec1.begin() + 2, vec2.begin(), vec2.end()); // Chèn toàn bộ vec2
for (int x : vec1) std::cout << x << " "; // Output: 1 2 7 8 5
return 0;
}
Chèn danh sách khởi tạo
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 5};
vec.insert(vec.begin() + 1, {2, 3, 4}); // Chèn danh sách khởi tạo
for (int x : vec) std::cout << x << " "; // Output: 1 2 3 4 5
return 0;
}
Các hàm liên quan
push_back | Thêm một phần tử vào cuối vector |
erase | Xóa một hoặc nhiều phần tử khỏi vector |