试手的时候写的代码

好久没有用STL,就试手写了一段小代码

#include <iostream> 

#include <fstream> 
#include <algorithm> 
#include <vector> 
#include <functional> 
#include <gmp.h> 
#include <gmpxx.h> 
#include <cmath> 

#include <loki/functor.h> 
#include <loki/SmallObj.cpp> 

int main(){ 

    mpf_set_default_prec(1024); 
    mpf_class t(0); 
    gmp_randclass m(&gmp_randinit_default); 
    std::vector<mpf_class> v(100); 
    m.seed(); 

    Loki::Functor<mpf_class,TYPELIST_1(unsigned long)> 
f(&m,&gmp_randclass::get_f); 


    std::generate_n(v.begin(),100,Loki::BindFirst(f,1024u) ); 
    std::fstream fs("C:\\i.js"); 
    std::copy(v.begin(),v.end(),std::ostream_iterator<mpf_class>(fs,"\n")); 

    fs.close(); 

}

作用是生成100个精度为1024位的浮点数,输出到一个vector,然后把这个vector序列
化到一个file中。
今天试了一下,fstream的确是和ostream有太多的相似,也可以用这样的方式输出
std::copy(v.begin(),v.end(),std::ostream_iterator<mpf_class>(fs,"\n"));
可惜的是Generator并非是STL的一部分,STL并不提供从Unary functor到Generator
functor的转换,害得我还动用了loki.相较而下,loki功能灵巧却也异常繁琐。
Loki的Functor的一个缺点是,一旦把一个普通函数转换为Functor,之前的那些默认
参数也就没有了,很令人郁闷。
令人恼火的是,要生成一个高精度的浮点数可不是调用rand()那么简单,害得我弄了
一堆functor和bind出来。
后来我干脆试了一下,要vector干吗,直接往文件里面写。
std::generate_n(std::ostream_iterator<mpf_class>(fs,"\n"),100,Loki::BindFirst(f,1024u)
);
哇,ok.
最后发了下疯,是的,所有的代码缩为一行了,注意,这是真正的一行,只有一个分号。

int main(){std::generate_n(std::ostream_iterator<mpf_class>(std::fstream("C:\\i.js"),"\n"),100,Loki::BindFirst( 
        Loki::Functor<mpf_class,TYPELIST_1(unsigned 
long)>(&gmp_randclass(&gmp_randinit_default),&gmp_randclass::get_f) 
        ,1024u) );}

就当是又一次感叹了下C++的惊奇吧。不过这段代码可能在有的编译器上编译不过
去,反正我在我的VC++.net 2003中通过并运行成功了。
不过还是有些不爽,因为我用的 gmp++库还不是很完善,所以要高精度输出一个浮点
数,需要这样
gmp_printf("%100F.f\n",v[10].get_mpf_t());
这样一句代码足够让我前面的努力白费,hoho

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥