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

Hàm multiset::clear() trong C++ STL

std::multiset::clear() xóa tất cả phần tử khỏi multiset, làm cho nó trở thành rỗng (size = 0).

Cú pháp

void clear() noexcept;

Đặc điểm

  • Xóa tất cả phần tử, giải phóng bộ nhớ.
  • Sau khi gọi, empty() == true và size() == 0.
  • Không làm thay đổi comparator hay allocator.
  • Độ phức tạp: O(n) (gọi destructor cho mỗi phần tử).
  • Không ném exception.

Ví dụ 1: Xóa và kiểm tra

#include <bits/stdc++.h>
using namespace std;

int main() {
    int arr[] = {2, 4, 1, 3, 8, 5, 6};
    multiset<int> ms(arr, arr + 7); // {1,2,3,4,5,6,8}
    
    cout << "Trước clear: ";
    for (int x : ms) cout << x << ' ';
    cout << " (size = " << ms.size() << ")\n";
    
    ms.clear();
    
    cout << "Sau clear: ";
    for (int x : ms) cout << x << ' ';
    cout << " (size = " << ms.size() << ")\n";
    cout << "empty() = " << boolalpha << ms.empty() << '\n';
    
    return 0;
}

Đầu ra

Trước clear: 1 2 3 4 5 6 8 (size = 7)
Sau clear:  (size = 0)
empty() = true

Ví dụ 2: So sánh clear() vs gán multiset mới

#include <bits/stdc++.h>
using namespace std;

int main() {
    multiset<int> ms1 = {1, 2, 3};
    multiset<int> ms2 = {1, 2, 3};
    
    // Cách 1: clear()
    ms1.clear();
    ms1.insert(4);
    
    // Cách 2: gán mới
    ms2 = {4}; // operator= gán mới
    
    cout << "ms1: ";
    for (int x : ms1) cout << x << ' ';
    cout << "\nms2: ";
    for (int x : ms2) cout << x << ' ';
    cout << endl;
    
    return 0;
}

Đầu ra

ms1: 4
ms2: 4

Khi nào dùng clear() vs gán mới?

  • clear(): Giữ nguyên allocator, comparator, capacity (có thể tái sử dụng bộ nhớ đã cấp phát). Hiệu quả hơn nếu sẽ thêm phần tử mới ngay sau.
  • ms = { } hoặc ms = multiset<int>(): Tạo container mới, có thể thay đổi allocator/comparator, giải phóng toàn bộ bộ nhớ cũ.

Lưu ý

  • Iterator, pointer, reference đến các phần tử bị vô hiệu hóa (invalidated) sau clear().
  • Khác với vector::clear(), multiset không giữ capacity (vì là node-based container).