给出两个std :: vector v1,v2。
我想知道使用std :: swap(v1,v2)比v1.swap(v2)有什么好处。
我已经实现了一个关于性能观点的简单测试代码(我不确定它是否相关):
#include <iostream>
#include <vector>
#include <random>
#include <chrono>
#include <algorithm>
#define N 100000
template<typename TimeT = std::chrono::microseconds>
struct Timer
{
template<typename F, typename ...Args>
static typename TimeT::rep exec(F func, Args&&... args)
{
auto start = std::chrono::steady_clock::now();
func(std::forward<Args>(args)...);
auto duration = std::chrono::duration_cast<TimeT>(std::chrono::steady_clock::now() - start);
return duration.count();
}
};
void test_std_swap(std::vector<double>& v1, std::vector<double>& v2)
{
for (int i = 0; i < N; i ++)
{
std::swap(v1,v2);
std::swap(v2,v1);
}
}
void test_swap_vector(std::vector<double>& v1, std::vector<double>& v2)
{
for (int i = 0; i < N; i ++)
{
v1.swap(v2);
v2.swap(v1);
}
}
int main()
{
std::vector<double> A(1000);
std::generate( A.begin(), A.end(), [&]() { return std::rand(); } );
std::vector<double> B(1000);
std::generate( B.begin(), B.end(), [&]() { return std::rand(); } );
std::cout << Timer<>::exec<void(std::vector<double>& v1, std::vector<double>& v2)>(test_std_swap, A, B) << std::endl;
std::cout << Timer<>::exec<void(std::vector<double>& v1, std::vector<double>& v2)>(test_swap_vector, A, B) << std::endl;
std::cout << Timer<>::exec<void(std::vector<double>& v1, std::vector<double>& v2)>(test_std_swap, A, B) << std::endl;
std::cout << Timer<>::exec<void(std::vector<double>& v1, std::vector<double>& v2)>(test_swap_vector, A, B) << std::endl;
}
根据输出,如果没有优化 -O0 ,似乎vector :: swap似乎更快。 输出是(以微秒为单位):
20292
16246
16400
13898
使用 -O3 并没有任何不同之处。
752
752
752
760
答案 0 :(得分:10)
假设一个理智的实现,这两个函数应该以相同的方式实现。因此,您应该使用代码中最易读的内容。
特别是,如果我们查看std::swap(vector<T> & x, vector<T> & y)
的说明,则效果为x.swap(y)
。
答案 1 :(得分:7)
在任何情况下,你都应该不直接使用std::swap()
!相反,你应该使用这样的东西:
using std::swap;
swap(x, y);
对于std::vector<...>
,它可能没有什么区别,因为std::vector<...>
显然存在于命名空间std
中。否则,关键区别在于使用std::swap()
时正在使用默认实现,而有关ADL的方法可以找到更好的版本。
对swap(x, y)
std::vector<...>
和x
使用y
只会致电x.swap(y)
。为了与其他用途保持一致,我会使用上面列出的方法。
答案 2 :(得分:0)
来自实施文档:
void swap(vector& __x)
* This exchanges the elements between two vectors in constant time.
* (Three pointers, so it should be quite fast.)
* Note that the global std::swap() function is specialized such that
* std::swap(v1,v2) will feed to this function.
您可以看到std :: swap(v1,v2)只需调用v1.swap(v2)。