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

Hàm vector::insert() trong C++ STL

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