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

std::unordered_multiset::erase

#include <unordered_set>

// Phiên bản 1: Xóa phần tử tại vị trí được chỉ định
iterator erase(const_iterator pos);

// Phiên bản 2: Xóa các phần tử trong một phạm vi
iterator erase(const_iterator first, const_iterator last);

// Phiên bản 3: Xóa phần tử có giá trị cụ thể
size_type erase(const key_type& key);

Xóa một hoặc nhiều phần tử khỏi std::unordered_multiset.

Tham số

pos

  • Iterator trỏ đến phần tử cần xóa (phiên bản 1). pos phải là một iterator hợp lệ và có thể dereference được trong std::unordered_multiset.

first, last

  • Iterator xác định phạm vi các phần tử cần xóa (phiên bản 2). first trỏ đến phần tử đầu tiên cần xóa, last trỏ đến phần tử sau phần tử cuối cùng cần xóa (past-the-end).

key

  • Giá trị của phần tử cần xóa (phiên bản 3).

Giá trị trả về

  • Phiên bản 1 và 2:
    • iterator: Trả về một iterator trỏ đến phần tử theo sau phần tử cuối cùng bị xóa. Nếu không có phần tử nào như vậy (ví dụ: xóa phần tử cuối cùng của std::unordered_multiset), hàm trả về end().
  • Phiên bản 3:
    • size_type: Trả về số lượng phần tử đã bị xóa.

Đặc điểm

  1. Xóa phần tử tại vị trí cụ thể, theo giá trị hoặc theo phạm vi: erase() cho phép bạn xóa một phần tử duy nhất bằng iterator, xóa một dãy các phần tử liên tiếp bằng iterator, hoặc xóa tất cả các phần tử có giá trị bằng với key.
  2. Giảm kích thước: erase() làm giảm kích thước của std::unordered_multiset tương ứng với số lượng phần tử bị xóa.
  3. Hành vi không xác định khi iterator không hợp lệ: Gọi erase() với iterator không hợp lệ (ví dụ: pos trỏ đến end(), hoặc first, last không hợp lệ) sẽ dẫn đến hành vi không xác định.
  4. Có thể làm thay đổi iterator: Việc xóa phần tử khỏi std::unordered_multiset có thể làm thay đổi (invalidate) các iterator đang trỏ đến các phần tử trong std::unordered_multiset do việc rehash có thể xảy ra. Iterator trả về bởi hàm erase() là hợp lệ và trỏ đến phần tử tiếp theo sau phần tử cuối cùng bị xóa.
  5. Không trả về giá trị phần tử bị xóa: erase() không trả về giá trị của phần tử bị xóa.
  6. An toàn exception: Nếu exception xảy ra trong khi erase() đang chạy, ví dụ từ destructor của value_type, thì các thay đổi đã thực hiện (các phần tử đã xóa) vẫn có hiệu lực.
  7. Độ phức tạp:
    • Xóa một phần tử bằng iterator (phiên bản 1): Trung bình O(1), trường hợp xấu nhất O(n), với n là số phần tử trong std::unordered_multiset.
    • Xóa phần tử theo giá trị (phiên bản 3): Trung bình O(m), trường hợp xấu nhất O(n), với m là số phần tử bị xóa.
    • Xóa nhiều phần tử (phiên bản 2): Trung bình O(m), trường hợp xấu nhất O(n), với m là số phần tử bị xóa.

Ví dụ

#include <iostream>
#include <unordered_set>

int main() {
std::unordered_multiset<int> myumset = {10, 20, 30, 40, 50, 60, 30, 30};

// Phiên bản 1: Xóa phần tử tại vị trí thứ ba (giả sử là 30)
auto it = myumset.begin();
std::advance(it, 2); // Giả sử it đang trỏ đến phần tử thứ 3
it = myumset.erase(it);
// 'it' bây giờ trỏ đến phần tử sau phần tử đã bị xóa

// Phiên bản 2: Xóa hai phần tử đầu tiên
myumset.erase(myumset.begin(), std::next(myumset.begin(), 2));

// Phiên bản 3: Xóa tất cả phần tử có giá trị bằng 30
size_type num_removed = myumset.erase(30);
std::cout << "Number of elements removed: " << num_removed << '\n'; // Output: Number of elements removed: 2 (hoặc 3 nếu 30 chưa bị xóa hết)

// In ra các phần tử còn lại trong unordered_multiset
std::cout << "myumset after erasing elements:";
for (int x : myumset) std::cout << ' ' << x; // Output: myumset after erasing elements: 60 40 50 (thứ tự có thể khác)
std::cout << '\n';

return 0;
}

Các hàm liên quan

clearXóa tất cả các phần tử khỏi std::unordered_multiset
insertChèn một hoặc nhiều phần tử mới vào std::unordered_multiset
findTìm kiếm một phần tử có giá trị bằng với giá trị cho trước trong std::unordered_multiset