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() == truevà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ặcms = 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).