Chuyển tới nội dung chính

std::multiset::insert

#include <set>

// Phiên bản 1: Chèn một phần tử (C++98 và C++11)
iterator insert(const value_type& val);
iterator insert(value_type&& val); // (since C++11)

// Phiên bản 2: Chèn một phần tử với gợi ý vị trí (C++98 và C++11)
iterator insert(const_iterator hint, const value_type& val);
iterator insert(const_iterator hint, value_type&& val); // (since C++11)

// Phiên bản 3: Chèn các phần tử từ một phạm vi khác (C++98 và C++11)
template <class InputIterator>
void insert(InputIterator first, InputIterator last);

// Phiên bản 4: Chèn các phần tử từ initializer list (C++11)
void insert(initializer_list<value_type> ilist);

Chèn một hoặc nhiều phần tử mới vào std::multiset. Khác với std::set, std::multiset cho phép chèn các phần tử trùng lặp, do đó, insert() sẽ luôn chèn phần tử mới vào std::multiset, ngay cả khi phần tử đó đã tồn tại. Các phần tử trong std::multiset vẫn được duy trì thứ tự sắp xếp sau khi chèn.

Tham số

val

  • Giá trị của phần tử cần chèn (phiên bản 1 và 2).

hint

  • Iterator gợi ý vị trí chèn (phiên bản 2).

first, last

  • Iterator xác định phạm vi các phần tử cần chèn (phiên bản 3).

ilist

  • initializer_list chứa các phần tử cần chèn (phiên bản 4).

Giá trị trả về

  • Phiên bản 1:
    • Trả về iterator trỏ đến phần tử vừa được chèn vào trong std::multiset.
  • Phiên bản 2:
    • Trả về iterator trỏ đến phần tử vừa được chèn vào trong std::multiset.
  • Phiên bản 3 và 4:
    • void: Không trả về giá trị nào.

Đặc điểm

  1. Chèn phần tử, cho phép trùng lặp: std::multiset cho phép lưu trữ các phần tử trùng lặp, do đó insert() luôn chèn phần tử mới vào std::multiset
  2. Giữ nguyên thứ tự sắp xếp: insert() đảm bảo các phần tử trong std::multiset luôn được sắp xếp sau khi chèn.
  3. Hỗ trợ gợi ý vị trí: Phiên bản insert(hint, val) cho phép bạn cung cấp gợi ý vị trí chèn, có thể giúp cải thiện hiệu suất nếu bạn biết vị trí chèn gần đúng.
  4. Hỗ trợ move semantics: Phiên bản insert(const_iterator pos, value_type&& val) (từ C++11) hỗ trợ di chuyển (move semantics), giúp tối ưu hiệu suất khi chèn các đối tượng lớn hoặc phức tạp.
  5. Có thể làm thay đổi iterator: Việc chèn phần tử vào std::multiset có thể làm thay đổi (invalidate) các iterator đang trỏ đến các phần tử khác trong std::multiset.
  6. Có thể ném ngoại lệ: Nếu việc cấp phát bộ nhớ cho phần tử mới thất bại, insert() có thể ném ra ngoại lệ std::bad_alloc. Ngoài ra, nếu copy constructor (phiên bản 1) hoặc move constructor (phiên bản 2) của value_type ném ngoại lệ, insert() cũng sẽ ném ngoại lệ.
  7. Độ phức tạp:
    • Chèn một phần tử: O(log n), với n là số phần tử trong std::multiset.
    • Chèn nhiều phần tử (phiên bản 3 và 4): O(k log n), với k là số phần tử được chèn và n là số phần tử trong std::multiset.

Ví dụ

#include <iostream>
#include <set>
#include <vector>

int main() {
std::multiset<int> mymultiset;

// Phiên bản 1: Chèn từng phần tử
mymultiset.insert(30);
mymultiset.insert(10);
mymultiset.insert(50);
mymultiset.insert(20);
mymultiset.insert(30); // Phần tử trùng lặp được cho phép

std::cout << "mymultiset after inserting elements:";
for (int x : mymultiset) std::cout << ' ' << x; // Output: mymultiset after inserting elements: 10 20 30 30 50
std::cout << '\n';

// Phiên bản 2: Chèn với gợi ý vị trí
auto it = mymultiset.find(20); // Giả sử ta biết 20 ở gần vị trí cần chèn 25
mymultiset.insert(it, 25); // Chèn 25 gần vị trí của 20 (có thể nhanh hơn)

// Phiên bản 3: Chèn từ một range
std::vector<int> vec = {40, 60, 15, 40};
mymultiset.insert(vec.begin(), vec.end());

// Phiên bản 4: Chèn từ initializer list
mymultiset.insert({5, 35, 45});

std::cout << "mymultiset after more insertions:";
for (int x : mymultiset) std::cout << ' ' << x; // Output: mymultiset after more insertions: 5 10 15 20 25 30 30 35 40 40 45 50 60
std::cout << '\n';

return 0;
}

Các hàm liên quan

eraseXóa một hoặc nhiều phần tử khỏi std::multiset
findTìm kiếm một phần tử có giá trị bằng với giá trị cho trước trong std::multiset