給定兩個std :: vector v1,v2。
我想知道使用std :: swap(v1,v2)比v1.swap(v2)有什麼好處。在向量或向量之間使用std :: swap :: swap?
我實現了一個簡單的測試代碼(我不知道這是有關)有關的性能上來看:
#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。 輸出是(微秒):
20292
16246
16400
13898
並與-O3沒有revelant差異。
752
752
752
760
除了一般性。 –
@DietmarKühl絕對是的。我的意思是「超載」,但現在編輯我的第一條評論爲時已晚。 – juanchopanza