代码虽少,但是如果你能读懂程序,也就算是个高手了
#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;
}