《认清C++语言》のrandom_shuffle()和transform()算法

1STL中的函数random_shuffle()用来对一个元素序列进行重新排序(随机的),函数原型如下:

 

template<class RandomAccessIterator>

   void random_shuffle(

      RandomAccessIterator _First, //指向序列首元素的迭代器

      RandomAccessIterator _Last  //指向序列最后一个元素的下一个位置的迭代器

   );

template<class RandomAccessIterator, class RandomNumberGenerator>

   void random_shuffle(

      RandomAccessIterator _First,

      RandomAccessIterator _Last,

      RandomNumberGenerator& _Rand //调用随机数产生器的函数

   );

 

random_shuffle()是一个完全通用的算法,适用于内置数据类型和用户自定义类型。同时,由于STL算法不仅适用于容器,也适用于序列,因此,random_shuffle()算法可用于内置数组。

 

实例代码如下:

#include <iostream>

#include <vector>

#include <algorithm>

#include <string>

 

int main()

{

    //用于内置数据类型

    std::vector<int> vi;

    for(int i=0; i<100; i++)

    {

        vi.push_back(i);        

    }

   

    std::random_shuffle(vi.begin(), vi.end());

   

    std::vector<int>::iterator it;

    for(it=vi.begin(); it!=vi.end(); it++)

    {

        std::cout<<*it<<std::endl;                  

    }

   

    //用于用户自定义类型

    std::vector<std::string> vs;

    vs.push_back(std::string("Sunday"));

    vs.push_back(std::string("Monday"));

    vs.push_back(std::string("Tuesday"));

    vs.push_back(std::string("Wednesday"));

    vs.push_back(std::string("Thursday"));

    vs.push_back(std::string("Friday"));

    vs.push_back(std::string("Saturday"));

   

    std::random_shuffle(vs.begin(), vs.end());

   

    for(int i=0; i<7; i++)

    {

        std::cout<<vs[i]<<std::endl;       

    }

   

    //用于数组

    char arr[6] = {'a', 'b', 'c', 'd', 'e', 'f'};

    std::random_shuffle(arr, arr+6);

    for(int i=0; i<6; i++)

    {

        std::cout<<arr[i]<<" ";       

    }

    std::cout<<std::endl;

    system("pause");

    return 0;

}

 

2STL中的函数transform()用来遍历一个容器里面指定范围的元素,并对这些元素执行指定的操作,函数原型如下:

template<class InputIterator, class OutputIterator, class UnaryFunction>

   OutputIterator transform(

      InputIterator _First1, //元素起始位置的输入迭代器

      InputIterator _Last1, //元素结束位置的输入迭代器

      OutputIterator _Result, //执行指定操作的元素的起始位置的输出迭代器

      UnaryFunction _Func //执行的操作(函数)

   );

template<class InputIterator1, class InputIterator2, class OutputIterator,

   class BinaryFunction>

   OutputIterator transform(

      InputIterator1 _First1, //第一个操作范围的元素起始位置的输入迭代器

      InputIterator1 _Last1, //第一个操作范围的元素结束位置的输入迭代器

      InputIterator2 _First2, //第二个操作范围的元素起始位置的输入迭代器

      OutputIterator _Result, //最终范围的元素的起始位置的输出迭代器

      BinaryFunction _Func //执行的操作(函数)

   );

 

上面第一个版本的算法对区间[_First1, _Last1]中的每个元素应用函数_Func,并将每次_Func返回的结果存储到_Result中;

第二个版本的算法以类似的方式运行,但它期望获得两个序列并逐次调用一个处理成对元素的二元函数。

 

实例代码如下:

#include <vector>

#include <algorithm>

#include <functional>

#include <iostream>

 

// The function object multiplies an element by a Factor

template <typename T>

class MultiValue

{

private:

    T Factor;   //The value to multiply by

public:

    //Constructor initializes the value to multiply by

    MultiValue(const T& _val) : Factor(_val)

    {

    }

    //The function call for the element to be multiplied

    T operator()(T& elem) const

    {

        return elem*Factor;               

    }

};

 

int main()

{

    using namespace std;

    vector<int> v1, v2(7), v3(7);

    vector<int>::iterator it1, it2, it3;

   

    //Constructing vector v1;

    for(int i=-4; i<=2; i++)

    {

        v1.push_back(i);       

    }   

   

    cout<<"Original vector v1=(";

    for(it1=v1.begin(); it1!= v1.end(); it1++)

    {

        cout<<*it1<<" ";                   

    }

    cout<<")."<<endl;

   

    //Modifying the vector v1 in place

    transform(v1.begin(), v1.end(), v1.begin(), MultiValue<int>(2));

    cout<<"The elements of the vector v1 multiplied by 2 in place gives:"

        <<"/n v1mod=(";

    for(it1=v1.begin(); it1!=v1.end(); it1++)

    {

        cout<<*it1<<" ";                   

    }

    cout<<")."<<endl;

   

    //using transform to multiply each element by a factor of 5

    transform(v1.begin(), v1.end(), v2.begin(), MultiValue<int>(5));

   

    cout<<"Multiplying the elements of the vector v1mod/n"

        <<"by the factor 5 & copying to v2 gives:/n v2=(";

    for(it2=v2.begin(); it2!=v2.end(); it2++)

    {

        cout<<*it2<<" ";                   

    }

    cout<<")."<<endl;

   

    //The second version of transform used to multiply the

    //elements of the vectors v1mod & v2 pairwise

    transform(v1.begin(), v1.end(), v2.begin(), v3.begin(),

                          multiplies<int>());

    cout<<"Multiplying elements of the vectors v1mod and v2 pairwise "

        <<"gives:/n v3=( ";

    for(it3=v3.begin(); it3!=v3.end(); it3++)

    {

        cout<<*it3<<" ";

    }

    cout<<")."<<endl;

   

    system("pause");

    return 0;

}

 

程序运行后输出如下:

Original vector  v1 = ( -4 -3 -2 -1 0 1 2 ).
The elements of the vector v1 multiplied by 2 in place gives:
 v1mod = ( -8 -6 -4 -2 0 2 4 ).
Multiplying the elements of the vector v1mod
 by the factor 5 & copying to v2 gives:
 v2 = ( -40 -30 -20 -10 0 10 20 ).
Multiplying elements of the vectors v1mod and v2 pairwise gives:
 v3 = ( 320 180 80 20 0 20 80 ).

 

 

 

 

 

posted on 2010-09-07 15:36  android开发实例  阅读(893)  评论(0编辑  收藏  举报

导航