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

std::set::swap

#include <set>

void swap(set& other);

Hoán đổi nội dung của hai std::set với nhau.

Tham số

other

  • Tham chiếu đến std::set khác mà bạn muốn hoán đổi nội dung. other phải là một std::set có cùng kiểu tham số với std::set hiện tại.

Giá trị trả về

Không có giá trị trả về

Đặc điểm

  1. Hoán đổi nội dung: swap() hoán đổi toàn bộ nội dung của hai std::set, bao gồm tất cả các phần tử, kích thước, hàm so sánh và bộ cấp phát của chúng.
  2. noexcept: Kể từ C++17, swap() cho 2 std::set có cùng allocator được đánh dấu là noexcept, nghĩa là nó được đảm bảo không ném ra ngoại lệ nào. Trước C++17, hoặc khi 2 set có allocator khác nhau, nó có thể ném ngoại lệ.
  3. An toàn: Sau khi gọi swap(), các iterator, tham chiếu, và con trỏ ban đầu trỏ đến các phần tử của std::set này sẽ trỏ đến các phần tử của std::set kia.
  4. Phiên bản non-member std::swap: Ngoài hàm thành viên swap(), C++ còn cung cấp phiên bản non-member std::swap (trong <algorithm><set>) có thể được sử dụng để hoán đổi hai std::set. Phiên bản non-member thường được ưu tiên hơn vì nó khái quát hơn và có thể hoạt động với nhiều kiểu dữ liệu khác.
  5. Hiệu quả: swap() được thực hiện với độ phức tạp O(1) - thời gian hằng số. Việc hoán đổi được thực hiện bằng cách trao đổi các con trỏ quản lý dữ liệu bên trong của hai std::set, thay vì sao chép từng phần tử.

Ví dụ

#include <iostream>
#include <set>

int main() {
std::set<int> set1 = {1, 2, 3};
std::set<int> set2 = {4, 5, 6, 7};

std::cout << "set1 before swap:";
for (int x : set1) std::cout << ' ' << x;
std::cout << '\n'; // Output: set1 before swap: 1 2 3

std::cout << "set2 before swap:";
for (int x : set2) std::cout << ' ' << x;
std::cout << '\n'; // Output: set2 before swap: 4 5 6 7

set1.swap(set2); // Hoán đổi nội dung của set1 và set2

std::cout << "set1 after swap:";
for (int x : set1) std::cout << ' ' << x;
std::cout << '\n'; // Output: set1 after swap: 4 5 6 7

std::cout << "set2 after swap:";
for (int x : set2) std::cout << ' ' << x;
std::cout << '\n'; // Output: set2 after swap: 1 2 3

return 0;
}