Chinaunix

标题: generate(v.begin(),v.end(),rand);//这里用rand()怎么不行? [打印本页]

作者: mabuc    时间: 2009-05-21 11:34
标题: generate(v.begin(),v.end(),rand);//这里用rand()怎么不行?


  1. vector<int> v(N);
  2.    
  3.    generate(v.begin(),v.end(),rand);//这里用rand可以,但用rand()不行,多对括号反而不行,为什么?

复制代码

[ 本帖最后由 mabuc 于 2009-5-21 11:56 编辑 ]
作者: daybreakcx    时间: 2009-05-21 11:37
应该是可以的吧,给一个MSDN里面的例子,东西是类似的
// alg_generate.cpp

// compile with: /EHsc

#include <vector>
#include <deque>
#include <algorithm>
#include <iostream>
#include <ostream>

int main( )
{
   using namespace std;

   // Assigning random values to vector integer elements

   vector <int> v1 ( 5 );
   vector <int>::iterator Iter1;
   deque <int> deq1 ( 5 );
   deque <int>::iterator d1_Iter;
   
   generate ( v1.begin ( ), v1.end ( ) , rand );
   
   cout << "Vector v1 is ( " ;
   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
      cout << *Iter1 << " ";
   cout << ")." << endl;

   // Assigning random values to deque integer elements

   generate ( deq1.begin ( ), deq1.end ( ) , rand );

   cout << "Deque deq1 is ( " ;
   for ( d1_Iter = deq1.begin( ) ; d1_Iter != deq1.end( ) ; d1_Iter++ )
      cout << *d1_Iter << " ";
   cout << ")." << endl;
}

作者: OwnWaterloo    时间: 2009-05-21 16:06
标题: 回复 #1 mabuc 的帖子
template<class For,class Gen>
void generate(For first,For last,Gen g) {
    for (;first!=last;++first) *first=g();
}

注意红色部分。
g必须可以 g();
并且返回值可以被 *first接受。

generate( v.begin(),v.end(), rand ) 是可以的。
Gen = int (*)(void);
Gen g = rand;
g(); 就是 对rand的调用 : rand();


generate( v.begin(),v.end(), rand() ) 是不行的。

Gen = int;
Gen g = rand(); // g一个随机整数,它就不支持如下语法:
g();


--------

struct Random {
    int operator()() const {
        return rand();
    }
};

generate( v.begin(),v.end(), Random ); 是不行的, 因为Random是一个类型名, 而这里需要一个对象作为generate的实际参数。
generate( v.begin(),v.end(), Random() );  使用 Random()构造一个对象。

Gen = Random
Gen g = Random();
g() 就是 调用g的调用操作符。

[ 本帖最后由 OwnWaterloo 于 2009-5-21 16:08 编辑 ]
作者: windyrobin    时间: 2009-05-21 16:18
OwnWaterloo 老弟的解释从来都是
透彻而全面滴!!!
作者: jeanlove    时间: 2009-05-21 16:21
原帖由 mabuc 于 2009-5-21 11:34 发表


vector v(N);
   
   generate(v.begin(),v.end(),rand);//这里用rand可以,但用rand()不行,多对括号反而不行,为什么?


rand作为一个算子(类似函数指针)被传入,不是传函数的返回值。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2