STL算法C++中的Swap()
Swap() in STL algorithm C++
为什么 swap()
在 STL 算法中不获取变量的地址并传递变量工作得很好,但在 C++ 中按值调用不更改实际值但按地址调用更改实际参数?
std::swap
其实就是一个模板函数。因此,如果您查看调用 std::swap
的方式:
template< class T >
void swap( T& a, T& b ) noexcept
这意味着尽管您似乎是按值传递参数,但模板实际上会将类型推断为参数的相应地址。
例如,如果您有这样的代码:
int a1 = 1;
int a2 = 2;
std::swap(a1, a2);
当你 运行 std::swap(a1, a2)
时,a1
和 a2
的类型将被传递给模板,这使得 T
成为 int
.
然后将函数中的T
替换为int
,生成如下函数:
void swap(int& a, int& b)
{
...
}
所以 std::swap
实际上是在获取这些值的地址,但是你在调用函数时不需要写出它们。
为什么 swap()
在 STL 算法中不获取变量的地址并传递变量工作得很好,但在 C++ 中按值调用不更改实际值但按地址调用更改实际参数?
std::swap
其实就是一个模板函数。因此,如果您查看调用 std::swap
的方式:
template< class T >
void swap( T& a, T& b ) noexcept
这意味着尽管您似乎是按值传递参数,但模板实际上会将类型推断为参数的相应地址。
例如,如果您有这样的代码:
int a1 = 1;
int a2 = 2;
std::swap(a1, a2);
当你 运行 std::swap(a1, a2)
时,a1
和 a2
的类型将被传递给模板,这使得 T
成为 int
.
然后将函数中的T
替换为int
,生成如下函数:
void swap(int& a, int& b)
{
...
}
所以 std::swap
实际上是在获取这些值的地址,但是你在调用函数时不需要写出它们。