Was this page helpful?
Your feedback about this content is important. Let us know what you think.
Additional feedback?
1500 characters remaining
Export (0) Print
Expand All
abs
Expand Minimize
Important This document may not represent best practices for current development, links to downloads and other resources may no longer be valid. Current recommended version can be found here.

Predicate Version of random_shuffle 

Illustrates how to use the predicate version of the random_shuffle Standard Template Library (STL) function in Visual C++.


template<class RandomAccessIterator, class Predicate> inline
   void random_shuffle(
      RandomAccessIterator First,
      RandomAccessIterator Last,
      Predicate Pred
   )

NoteNote

The class/parameter names in the prototype do not match the version in the header file. Some have been modified to improve readability.

The random_shuffle algorithm shuffles the elements of a sequence [First..Last) in a random order. The predicate version uses the Pred function to generate the indices of the elements to swap. The Pred has to be a function object that takes a parameter n and returns an integral random number in the range 0 - (n - 1). The predicate version of random_shuffle uses operator= to perform swaps.

// random_shufflePV.cpp
// compile with: /EHsc
// Illustrates how to use the predicate version
// of the random_shuffle function.
//
// Functions:
//    random_shuffle: Shuffle the elements in a random order.
//
//      Rand: Given n, generates an integral random number in the
//          in the range 0 - (n - 1).
//////////////////////////////////////////////////////////////////////

// disable warning C4786: symbol greater than 255 character,
// okay to ignore
#pragma warning(disable: 4786)

#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>

using namespace std;


// return an integral random number in the range 0 - (n - 1)
int Rand(int n)
{
    return rand() % n ;
}

int main()
{
   const int VECTOR_SIZE = 8 ;

   // Define a template class vector of int
   typedef vector<int > IntVector ;

   // Define an iterator for template class vector of strings
   typedef IntVector::iterator IntVectorIt ;

   IntVector Numbers(VECTOR_SIZE) ;

   IntVectorIt start, end, it ;

   // Initialize vector Numbers
   Numbers[0] = 4 ;
   Numbers[1] = 10;
   Numbers[2] = 70 ;
   Numbers[3] = 30 ;
   Numbers[4] = 10;
   Numbers[5] = 69 ;
   Numbers[6] = 96 ;
   Numbers[7] = 100;

   // location of first element of Numbers
   start = Numbers.begin();

   // one past the location last element of Numbers
   end = Numbers.end();

   cout << "Before calling random_shuffle:" << endl;

   // print content of Numbers
   cout << "Numbers {";
   for (it = start; it != end; it++)
      cout << " "  << *it;
   cout << " }" << endl;

   // shuffle the elements in a random order.
   // the pointer_to_unary_function adapter converts a function to a
   // function object.
   random_shuffle(start, end, pointer_to_unary_function<int, int>(Rand));

   cout << "After calling random_shuffle:" << endl;

   cout << "Numbers {";
   for (it = start; it != end; it++)
      cout << " " << *it;
   cout << " }" << endl;
}

Before calling random_shuffle:
Numbers { 4 10 70 30 10 69 96 100 }
After calling random_shuffle:
Numbers { 10 10 96 70 4 69 100 30 }

Header: <algorithm>

Community Additions

ADD
Show:
© 2015 Microsoft