CppDS.com

C++ 98 11 14 17 20 手册

std::array<T,N>::swap

来自cppreference.com
< cpp‎ | container‎ | array
void swap( array& other ) noexcept(/* see below */);
(C++11 起)
(C++20 前)
constexpr void swap( array& other ) noexcept(/* see below */);
(C++20 起)

将容器内容与 other 的内容交换。不导致迭代器和引用关联到别的容器。

参数

other - 要与之交换内容的 array

返回值

(无)

异常

noexcept 规定:  
noexcept(noexcept(swap(std::declval<T&>(), std::declval<T&>())))

在以上表达式中,按照同 C++17 std::is_nothrow_swappable 特性所用的行为查找标识符 swap

(C++17 前)
noexcept 规定:  
(C++17 起)
对于零长 array
noexcept 规定:  
noexcept
  

复杂度

与容器大小成线性。

示例

#include <array>
#include <iostream>
 
template<class Os, class V> Os& operator<<(Os& os, const V& v) {
    os << "{";
    for (auto i : v) os << ' ' << i;
    return os << " } ";
}
 
int main()
{
    std::array<int, 3> a1{1, 2, 3}, a2{4, 5, 6};
 
    auto it1 = a1.begin();
    auto it2 = a2.begin();
    int& ref1 = a1[1];
    int& ref2 = a2[1];
 
    std::cout << a1 << a2 << *it1 << ' ' << *it2 << ' ' << ref1 << ' ' << ref2 << '\n';
    a1.swap(a2);
    std::cout << a1 << a2 << *it1 << ' ' << *it2 << ' ' << ref1 << ' ' << ref2 << '\n';
 
    // 注意交换后迭代器与引用保持与原 array 关联,
    // 例如 `it1` 仍指向元素 a1[0] , `ref1` 仍指代 a1[1] 。
}

输出:

{ 1 2 3 } { 4 5 6 } 1 4 2 5
{ 4 5 6 } { 1 2 3 } 4 1 5 2

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR 应用于 出版时的行为 正确行为
LWG 2456 C++11 noexcept 规定曾为谬构 使之有效

参阅

特化 std::swap 算法
(函数模板)
关闭