首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

代码虽少,但是如果你能读懂程序,也就算是个高手了解决方案

2012-02-24 
代码虽少,但是如果你能读懂程序,也就算是个高手了#includealgorithm#includefunctional#includeitera

代码虽少,但是如果你能读懂程序,也就算是个高手了
#include   <algorithm>

#include   <functional>

#include   <iterator>

#include   <stdio.h>


struct   Sink   :   std::iterator <std::output_iterator_tag,   void,   void,   void,   void>   {

      template <typename   T>   Sink&   operator=(T   const&)   {   return   *this;   }

      Sink&   operator*()   {   return   *this;   }

      Sink   const&   operator*()   const   {   return   *this;   }

      Sink&   operator++()   {   return   *this;   }   //   Pre-increment

      Sink&   operator++(int)   {   return   *this;   }   //   Post-increment

};


namespace   mystd   {

      template <typename   In,   typename   F>   inline

      F   for_each(In   begin,   In   end,   F   f)   {

            std::transform(begin,   end,   Sink(),   f);

            return   f;

      }  

}


int   primes[]   =   {   2,   3,   5,   7,   11,   13,   17,   19,   23,   29,   31   };


struct   Print:   std::unary_function <int,   int>   {

      int   operator()(int   i)   const   {

            printf( "%d\n ",   i);

            return   i;

      }

};


int   main()   {

      mystd::for_each(&primes[0],   &primes[0]+sizeof(primes)/sizeof(primes[0]),

                                      Print());

      return   0;

}

[解决办法]
都是stl泛型函数调用,怎么了
[解决办法]
不如说你哪不懂吧。这是最基本的STL使用了。
当然,如果你想掌握它,你得认真看《STL源码剖析》
[解决办法]
楼主没看过 STL ?

懂点 stl 不算高手, 只能算入门.
[解决办法]
stl
[解决办法]
不懂就不懂,问问题还装得跟大爷似的,KAO
[解决办法]
阅读无困难。
[解决办法]
代码虽少,但是如果你能读懂程序,也就算是个高手了
-----------------------------------------------
题目很诱人,但是好像没有那么悬阿^_^
[解决办法]
Sink是一个迭代子,它的功能就是什么都不做
for_each是一个模板函数,它调用标准库的transform模板函数,实际上就是一个循环语句
Print是一个函数对象,它的功能就是打印一个整数。

Sink在代码中没有被使用,无任何实际功能,但Sink写的并不对,它没有在构造函数但重载了=算子实际使用中编译会不通过。



&primes[0]+sizeof(primes)/sizeof(primes[0])是极其糟糕的写法,只有最愚蠢从程序员才这样写,这段程序的功能实际上相当于

int primes[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31 };
int main()
{
for(int i=0;i <sizeof(primes);++i)
cout < <primes[i] < <endl;
return 0;
}

这段代码不能用于炫耀,这是脱裤子放屁,多此一举



[解决办法]
struct Sink : public std:: iterator <std::output_iterator_tag, void, void, void, void>
{//继承出一个输出迭代器,不是用通常的class而且省略继承关键字public
给阅读带来难度.
虽然在transform中使用了,但却是无意义的.
main中把输出放在Print中,违背了std::transform通常的做法.
std::transform的本意是,对输入范围beg,end中的每个元素应用
指定的操作(些例中为函数对象Print),将结果写到dest(既此例中的Sink)
template <typename T>
Sink& operator=(T const&) { return *this; }
Sink& operator*() { return *this; }
Sink const& operator*() const { return *this; }
Sink& operator++() { cout < < "X " < <endl;return *this; } // Pre-increment
Sink& operator++(int) { return *this; } // Post-increment
};

namespace mystd {
template <typename In, typename F> inline
F for_each(In begin, In end, F f)
{
std::transform(begin, end, Sink(), f);
这里的Sink()创建的是个临时对象,且++操作定义在原地不变
所以根本就没有用. 可用下面的样子输出的控制台,而f做对元素另外的操作.
std::transform(begin, end, ostream_iterator <int> (cout, " "), f);
return f;
}
}

int primes[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31 };

struct Print: std::unary_function <int, int>
{
int operator()(int i) const {
printf( "%d\n ", i);
把这里定义成输出,就如前面有人说的, "脱裤子放屁 "
它应该对每一个元素执行你想的更复杂一些的操作
比如: i*3%10
return i*3%10;
}
};


int main() {
mystd::for_each(&primes[0], &primes[0]+sizeof(primes)/sizeof(primes[0]),Print());
return 0;
}


热点排行