std::swap 和 std::vector::swap 的区别

17 Mar 2025 | 5 分钟阅读

在 C++ 中。但在讨论差异之前,我们必须了解 C++ 中的 std::swap 和 std::vector::swap。

什么是 std::swap?

实用函数 std::swap 在 C++ 标准库的 <algorithm> 头文件中定义。它允许交换两个对象的值。

语法

std::swap 的语法是

它接受两个参数;都是 T 类型的引用对象。它使用移动语义或复制和赋值来交换值。

关于 std::swap 的一些关键点

  • 它是模板化的,因此适用于任何支持 复制/移动 的类型
  • 它通过移动而不是复制来高效地交换值。
  • 许多 C++ 算法和容器使用它来重新排列元素。
  • std::stringstd::vector 等某些类型提供了特殊化以优化性能。
  • 它提供了一种一致的方式来交换对象,而无需在所有地方重写交换代码。

使用 std::swap 的一些示例:

示例

让我们看一个 C++ 示例代码,它演示了使用 std::swap() 函数交换两个向量。

输出

Original Vector 1: 1 2 3 4 5
Original Vector 2: 10 20 30 40 50
Vectors after swapping:
Vector 1 (after swap): 10 20 30 40 50
Vector 2 (after swap): 1 2 3 4 5

说明

在此示例中,代码定义了两个向量,显示它们的原始内容,使用 std::swap() 交换它们,然后显示交换后向量的内容。请注意,std::swap() 用于高效地更改所有向量。

什么是 std::vector::swap?

std::vector 类的 std::vector::swap 成员函数高效地交换一个向量与另一个向量的内容。

语法

它具有以下语法:

它接受一个参数 - 对另一个 std::vector 的引用,以交换内容。

关于 std::vector::swap 的一些关键点

  • 它通过改变内部指针、大小、容量等来交换内容。这使得它非常高效,因为不需要实际的数据移动。
  • 向量必须是相同类型(持有相同数据类型)。它们当前的分配可以不同。
  • 它不会使任何引用、指针和迭代器失效,这些引用、指针和迭代器指向向量中的元素。细节仍然相同;只是它们的顺序发生了变化。
  • 它以常数 O(1) 时间运行,因为它交换内部成员。

用法示例

示例

以下 C++ 代码演示了如何使用 std::vector::swap() 交换两个向量。

输出

Original Vector 1: 1 2 3 4 5
Original Vector 2: 10 20 30 40 50
Vectors after swapping:
Vector 1 (after swap): 10 20 30 4 5
Vector 2 (after swap): 1 2 3 40 50

说明

就像前面的示例一样,向量 1 的内容已使用 std::vector::swap() 与向量 2 的范围交换。

std::swap 和 std::vector::swap 的主要区别

Difference between std::swap and std::vector::swap

下表总结了 std::swap 和 std::vector::swap 之间的主要区别

特性std::swapstd::vector::swap
定义于<algorithm> 头文件<vector> 头文件中的 std::vector 类内
它交换什么交换任意两个对象的值交换两个 std::vector 对象的内容
参数接受两个对象的引用作为参数接受另一个向量的引用作为参数
普遍性适用于任何支持基本交换的类型专门用于 std::vector 对象
效率可能需要复制或移动元素数据。交换向量内部指针 - 无数据移动
速度取决于类型;字符串/向量的特殊化优化了它。常数时间 O(1) - 非常快
对迭代器的影响使参数的迭代器失效不会使任何迭代器或指针失效
内部机制复制或移动底层对象操作向量的内部元数据
用途通常用于任何可交换的对象用于高效地重新排列向量内容
用法示例std::swap(v1, v2);v1.swap(v2);

总而言之,std::swap 用于通用对象交换,而 std::vector::swap 利用向量的内部结构进行优化的、快速的向量重排,避免重新分配。后者不会破坏任何指向向量的现有引用。

结论

总之,std::swap 通过利用复制/移动操作交换任意两个对象,而 vector::swap 利用向量的内部结构以常数 O(1) 时间高效地交换内容,而不会使迭代器失效。