C++11 中的std::swap
header
// moved from <algorithm> to <utility> in C++11
non-array (1)
template <class T> void swap (T& a, T& b)
noexcept (is_nothrow_move_constructible<T>::value && is_nothrow_move_assignable<T>::value);
array (2)
template <class T, size_t N> void swap(T (&a)[N], T (&b)[N])
noexcept (noexcept(swap(*a,*b)));
注意:
Type T shall be move-constructible and move-assignable (or have swap defined for it, for version (2)).
std::swap 在C++11中定义在,而不再是头文件中。上述两个函数等效为:
template <class T> void swap (T& a, T& b)
{
T c(std::move(a)); a=std::move(b); b=std::move(c);
}
template <class T, size_t N> void swap (T (&a)[N], T (&b)[N])
{
for (size_t i = 0; i<N; ++i) swap (a[i],b[i]);
}
示例:
// swap algorithm example (C++98)
#include <iostream> // std::cout
#include <algorithm> // std::swap
#include <vector> // std::vector
int main () {
int x=10, y=20; // x:10 y:20
std::swap(x,y); // x:20 y:10
std::vector<int> foo (4,x), bar (6,y); // foo:4个20 bar:6个10
std::swap(foo,bar); // foo:6个10 bar:4个20
std::cout << "foo contains:";
for (std::vector<int>::iterator it=foo.begin(); it!=foo.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
foo contains: 10 10 10 10 10 10
本文详细介绍了C++11中std::swap函数的使用与实现,包括其从<algorithm>移至<utility>的变化,以及如何适用于非数组和数组类型。通过示例展示了std::swap在交换变量和容器中的应用。
2349

被折叠的 条评论
为什么被折叠?



