    #include <iostream>

    #include <vector>
    #include <random>
    #include <chrono>
    #include <algorithm>

    struct A {
        A(int i = 0) : i(i) {}
        int i;
        static int nSwaps;

        friend void swap(A& l, A& r)
        {
            ++nSwaps;
            std::swap(l.i, r.i);
        }

        bool operator<(const A& r) const
        {
            return i < r.i;
        }
    };

    int A::nSwaps = 0;

    using std::chrono::high_resolution_clock;
    using std::chrono::duration_cast;
    using std::chrono::milliseconds;


    int main()
    {
        std::vector<A> v(10000000);
    
        std::ranlux24_base gen(std::random_device{}());
        std::generate(v.begin(), v.end(), [&gen]() {return gen();});
    
        auto s = high_resolution_clock::now();
        std::sort(v.begin(), v.end());
        std::cout << duration_cast<milliseconds>(high_resolution_clock::now() - s).count() 
            << "ms with " << A::nSwaps << " swaps\n";
    
        A::nSwaps = 0;
        s = high_resolution_clock::now();
        std::shuffle(v.begin(), v.end(), gen);
        std::cout << duration_cast<milliseconds>(high_resolution_clock::now() - s).count() 
            << "ms with " << A::nSwaps << " swaps\n";
    }
