📜  std::swap 和 std::vector::swap 的区别(1)

📅  最后修改于: 2023-12-03 15:05:22.279000             🧑  作者: Mango

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

在 C++ 中,std::swap 是一个通用的 swap 函数,可以用来交换任意两个类型为 T 的对象的值。而 std::vector::swap 则是 std::vector 类特有的成员函数,用来交换两个 vector 对象的内容。

std::swap

std::swap 的函数原型如下:

template<typename T>
void swap(T& a, T& b);

这个函数接受两个参数,分别为类型为 T 的对象 a 和 b 的引用。在函数内部,它通过 std::move 和移动语义来实现交换操作。

因此,std::swap 可以用来交换任何类型为 T 的对象,包括内置类型和自定义类型。比如,我们可以用它来交换两个 int 类型的变量:

int a = 1, b = 2;
std::swap(a, b);
// 现在 a 的值为 2,b 的值为 1
std::vector::swap

std::vector::swap 的函数原型如下:

void swap(vector& other) noexcept;

该函数接受一个类型为 vector 的对象 other 的引用。在函数内部,它会直接交换当前 vector 对象和 other 对象的内部状态,包括它们的元素、大小和容量等信息。

因此,std::vector::swap 只能用来交换两个 vector 对象,而不能用于交换其他类型的对象。比如,我们可以用它来交换两个 vector

std::vector<int> a{1, 2, 3}, b{4, 5, 6};
a.swap(b);
// 现在 a 中的元素为 4,5,6,b 中的元素为 1,2,3

需要注意的是,std::vector::swap 是一个无异常的操作(noexcept),因此在实现移动语义时可以更加高效。同时,如果我们只是想交换两个 vector 对象的内容而不是整个对象,用 std::vector::swap 可以更快地完成操作。

总结

std::swap 和 std::vector::swap 都可以用来交换两个对象的值。但是,它们的用法和适用范围有所不同。如果我们需要交换任意类型的对象,可以使用 std::swap;如果我们只是需要交换两个 vector 对象的内容,可以使用 std::vector::swap。