Given two std::vector v1, v2.
I was wondering what are the benefits to use std::swap(v1, v2) over v1.swap(v2).
I have implemented a simple test code (I am not sure it is pertinent) regarding performance point of view :
#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;
}
According to outputs it seems that vector::swap seems faster without optimization -O0. Output is (in microseconds) :
20292
16246
16400
13898
And with -O3 there is no revelant difference.
752
752
752
760
The std::vector::swap function will always swap the contents of vector in constant time. In practice, both the functions will swap the contents of vectors in O(1) time and give the same performance.
Swapping two vectors means exchanging the contents of one vector with that of another. For vectors to be swapped, they have to be of the same type. C++ has a member function to do this. This means that one vector's swap() member function takes the other vector as an argument, then exchanges the contents.
The function std::swap() is a built-in function in the C++ Standard Template Library (STL) which swaps the value of two variables. Parameters: The function accepts two mandatory parameters a and b which are to be swapped. The parameters can be of any data type.
Assuming a sane implementation, both of those functions should be implemented identically. So you should use whatever is most readable in your code.
In particular, if we look at the description for std::swap(vector<T> & x, vector<T> & y)
, it's effect is x.swap(y)
.
You should not use std::swap()
directly in any case! Instead, you should use something like this:
using std::swap;
swap(x, y);
For std::vector<...>
it probably doesn't make a difference as std::vector<...>
obviously lives in namespace std
. Otherwise the key difference is that with using std::swap()
the default implementation is being used while with the approach outlined about ADL can find a better version.
Using swap(x, y)
for std::vector<...>
s x
and y
will just call x.swap(y)
. For consistency with other uses I would use the approach listed above.
References:
From implementation document:
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.
You can see that, std::swap(v1,v2) just invoke v1.swap(v2).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With