Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use std::swap between vectors or vector::swap?

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
like image 645
coincoin Avatar asked Dec 29 '14 15:12

coincoin


People also ask

Does STD swap work on vectors?

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.

Can you swap vectors C++?

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.

What does std :: swap do in C++?

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.


3 Answers

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).

like image 114
Bill Lynch Avatar answered Oct 05 '22 15:10

Bill Lynch


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:

  • How does "using std::swap" enable ADL?
  • what does `using std::swap` inside the body of a class method implementation mean?
like image 36
Dietmar Kühl Avatar answered Oct 05 '22 13:10

Dietmar Kühl


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).

like image 34
Jayhello Avatar answered Oct 05 '22 15:10

Jayhello