Usare la funzione STL random_shuffle in Visual C++

Questo articolo descrive come usare la random_shuffle funzione STL (Standard Template Library) in Visual C++.

Versione originale del prodotto: Visual C++
Numero KB originale: 156994

Intestazione obbligatoria

<algorithm>

Prototipo

template<class RandomAccessIterator, class Predicate> inline
void random_shuffle(RandomAccessIterator first,
                    RandomAccessIterator last,
                    Predicate pred)

Nota

I nomi di classe/parametro nel prototipo non corrispondono alla versione originale nel file di intestazione. Sono stati modificati per migliorare la leggibilità.

Descrizione

L'algoritmo random_shuffle rimescola gli elementi di una sequenza (first.. ultimo) in ordine casuale.

La versione del predicato usa la funzione pred per generare gli indici degli elementi da scambiare. Il pred deve essere un oggetto funzione che accetta un parametro n e restituisce un numero casuale integrale nell'intervallo da 0 a (n - 1).

La versione del predicato di random_shuffle usa operator= per eseguire scambi.

Codice di esempio

//////////////////////////////////////////////////////////////////////
// Compile options needed: /GX
// random_shuffle.cpp: 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).
// of Microsoft Product Support Services,
// Software Core Developer Support.
// Copyright (c) 1996 Microsoft Corporation. All rights reserved.
//////////////////////////////////////////////////////////////////////

// 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 ;
}

void main()
{
    const int VECTOR_SIZE = 8 ;

    // Define a template class vector of int
    typedef vector<int, allocator<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;

    start = Numbers.begin();   // location of first
                                // element of Numbers
    end = Numbers.end();       // one past the location
                                // last element of Numbers
    cout << "Before calling random_shuffle:\n" << endl;

    // print content of Numbers
    cout << "Numbers { ";
    for(it = start; it != end; it++)
        cout << *it << " ";
    cout << " }\n" << 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:\n" << endl;
    cout << "Numbers { ";
    for(it = start; it != end; it++)
        cout << *it << " ";
    cout << " }\n" << endl;
}

Output del programma:


Before calling random_shuffle

Numbers { 4 10 70 30 10 69 96 100  }

After calling random_shuffle

Numbers { 10 30 4 70 96 100 69 10  }

Riferimenti

Per altre informazioni sulla funzione, vedere random_shuffle (esempi STL).For more information about the random_shuffle function, visit random_shuffle (STL Samples).