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

std::list::swap

#include <list>

void swap(list& other);

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

Tham số

other

  • Tham chiếu đến std::list khác mà bạn muốn hoán đổi nội dung. other phải là một std::list có cùng kiểu phần tử với std::list 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::list, bao gồm tất cả các phần tử và kích thước của chúng.
  2. Hiệu quả: swap() thường đượ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::list, thay vì sao chép từng phần tử.
  3. Không làm thay đổi iterator (ngoại trừ iterator trỏ đến end()): swap() không làm thay đổi (invalidate) các iterator, tham chiếu, hoặc con trỏ trỏ đến các phần tử của cả hai std::list ngoại trừ iterator trỏ đến end() sẽ thay đổi.
  4. noexcept: swap() được đánh dấu là noexcept (kể từ C++11), nghĩa là nó được đảm bảo không ném ra ngoại lệ nào.
  5. 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::list này sẽ trỏ đến các phần tử của std::list kia.
  6. 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>) có thể được sử dụng để hoán đổi hai std::list. 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.

Ví dụ

#include <iostream>
#include <list>

int main() {
std::list<int> list1 = {1, 2, 3};
std::list<int> list2 = {4, 5, 6, 7};

std::cout << "list1 before swap:";
for (int x : list1) std::cout << ' ' << x;
std::cout << '\n';

std::cout << "list2 before swap:";
for (int x : list2) std::cout << ' ' << x;
std::cout << '\n';

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

std::cout << "list1 after swap:";
for (int x : list1) std::cout << ' ' << x;
std::cout << '\n';

std::cout << "list2 after swap:";
for (int x : list2) std::cout << ' ' << x;
std::cout << '\n';

return 0;
}