Optimal swapping of stl containers

Never use a temporary variable to swap two stl containers instead always use std::swap function. This function has different overloaded versions specialized in swapping every standard container.

So what’s the difference if we use a temporary variable swap and std::swap. The idea is that basically all stl containers use dynamic memory to store data, so for swapping such two containers we don’t have to copy every item in such a container but just to swap few internal pointers, since both containers are of the same type.

Here is a small function and it’s output which swaps two vectors containing plenty of elements. Take a look at the output…

[sourcecode language=’cpp’]void TestSwap()
    typedef double VT;
    typedef std::vector VTVector;

    // Count of elements
    const VTVector::size_type Size = 1000000;

    // Create two vector objects
    VTVector Vect1;
    VTVector Vect2;

    // Fill both vectors with random elements
    std::generate_n( std::back_inserter( Vect1 ), Size, rand );
    std::generate_n( std::back_inserter( Vect2 ), Size, rand );

    // Now swap and test performance //

// Performance measurement class
    Performance Perf;

// No scientific notation needed and also increase precision
    std::cout < < std::fixed << std::setprecision( 16 ); // Using temporary variable     {Perf.Start();     VTVector VTTemp = Vect1;     Vect1 = Vect2;     Vect2 = VTTemp;     const double PerfVal = Perf.Stop();     std::cout << "Swap performance with temporary variable: " << PerfVal << " ms";} // Using std::swap function     {Perf.Start();     std::swap( Vect1, Vect2 );     const double PerfVal = Perf.Stop();     std::cout << "nSwap performance with std::swap function: " << PerfVal << " msn";} } Output: Swap performance with temporary variable: 0.0191267064952015 ms Swap performance with std::swap function: 0.0000026732372498 ms [/sourcecode] So the output settles all debates. 🙂 Performance measurment class sourcecode is available here…

2 thoughts on “Optimal swapping of stl containers

  1. I would say whether your standard library includes a specialization of std::swap for STL containers or not is a QoI (quality of implementation) issue. You should prefer using the “native” swap function containers offer: Vect1.swap(Vect2).

    Also, you should NOT fully qualify standard functions like swap. Instead of “std::swap(x,y);” consider writing “using std::swap; swap(x,y);”. The difference is that the first version disables ADL (argument dependent lookup). But that’s usually not what you want. You want to select the most specialized swap function (possibly residing in another namespace, thanks to ADL).

    This is covered in “Effective C++” by Scott Meyers (a book worth buying). You might also be interested in Herb Sutter’s article “Namespaces and the Interface Principle”

    – P

  2. This depends on which STL you’re using. For example, using STLPort I noticed that in debug std::swap was roughly 5 times as fast, however in release it was 5 times slower.

Appreciate your comments...