免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1534 | 回复: 4
打印 上一主题 下一主题

generate(v.begin(),v.end(),rand);//这里用rand()怎么不行? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-21 11:34 |只看该作者 |倒序浏览


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

复制代码

[ 本帖最后由 mabuc 于 2009-5-21 11:56 编辑 ]

论坛徽章:
0
2 [报告]
发表于 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;
}

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
3 [报告]
发表于 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 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-05-21 16:18 |只看该作者
OwnWaterloo 老弟的解释从来都是
透彻而全面滴!!!

论坛徽章:
0
5 [报告]
发表于 2009-05-21 16:21 |只看该作者
原帖由 mabuc 于 2009-5-21 11:34 发表


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


rand作为一个算子(类似函数指针)被传入,不是传函数的返回值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP