Essential C++ 第五章代码
来源:互联网 发布:男生喜欢手办恶心知乎 编辑:程序博客网 时间:2024/05/17 05:50
版本一(5.1~5.6内容)
#include <iostream>#include <vector>using namespace std;class num_sequence{public: virtual ~num_sequence() {}; virtual int elem(int pos) const = 0; virtual const char* what_am_i() const = 0; static int max_elem() { return _max_elems;} virtual ostream& print(ostream &os = cout ) const = 0;protected: virtual void gen_elems(int pos) const = 0; bool check_integrity(int pos, int size) const; const static int _max_elems = 25;};bool num_sequence::check_integrity(int pos,int size) const{ if (pos <= 0 || pos >= _max_elems) { cerr << "!! invalid position: " << pos << " Cannot honor request.\n"; return false; } if (pos > size) gen_elems(pos); return true;}ostream& operator<<( ostream &os, const num_sequence &ns){ return ns.print( os);}class Fibonacci:public num_sequence{public: Fibonacci( int len = 1, int beg_pos = 1) : _length(len), _beg_pos(beg_pos) {} virtual int elem(int pos) const; virtual const char* what_am_i() const { return "Fibonacci";} virtual ostream& print( ostream &os = cout) const; int length() const { return _length;} int beg_pos() const { return _beg_pos;}protected: virtual void gen_elems(int pos) const; int _length; int _beg_pos; static vector<int> _elems;};vector<int> Fibonacci::_elems;int Fibonacci::elem(int pos) const{ if (! check_integrity(pos,_elems.size())) return 0; return _elems[pos-1];}void Fibonacci::gen_elems(int pos) const{ if (_elems.empty()) { _elems.push_back(1); cout << "gen_elems: 1\n"; _elems.push_back(1); cout << "gen_elems: 1\n"; } if (_elems.size() <= (unsigned)pos) { int ix = _elems.size(); int n_2 = _elems[ix-2]; int n_1 = _elems[ix-1]; for(; ix < pos; ++ix) { int elem = n_2 + n_1; cout << "gen_elems: " <<elem << endl; _elems.push_back(elem); n_2 = n_1; n_1 = elem; } }}ostream& Fibonacci::print(ostream &os) const{ int elem_pos = _beg_pos - 1; int end_pos = elem_pos + _length; if ( (unsigned)end_pos > _elems.size() ) Fibonacci::gen_elems(end_pos); while (elem_pos < end_pos) os << _elems[elem_pos++] << ' '; return os;}class Triangular:public num_sequence{public: Triangular( int len = 1, int beg_pos = 1) : _length(len), _beg_pos(beg_pos) {} virtual int elem(int pos) const; virtual const char* what_am_i() const { return "Triangular";} virtual ostream& print( ostream &os = cout) const; int length() const { return _length;} int beg_pos() const { return _beg_pos;}protected: virtual void gen_elems(int pos) const; int _length; int _beg_pos; static vector<int> _elems;};vector<int> Triangular::_elems;int Triangular::elem(int pos) const{ if (! check_integrity(pos,_elems.size())) return 0; return _elems[pos-1];}void Triangular::gen_elems(int pos) const{ if (_elems.size() <= (unsigned)pos) { int ix = _elems.size() ? _elems.size()+1 : 1; for( ; ix <= pos; ++ix) { _elems.push_back(ix*(ix+1)/2); cout << "gen_elems: " << *(--_elems.end()) << endl; } }}ostream& Triangular::print(ostream &os) const{ int elem_pos = _beg_pos - 1; int end_pos = elem_pos + _length; if ( (unsigned)end_pos > _elems.size() ) Triangular::gen_elems(end_pos); while (elem_pos < end_pos) os << _elems[elem_pos++] << ' '; return os;}inline void display(const num_sequence &ns, int pos, ostream &os = cout){ os << "The element at position " << pos << " for the " << ns.what_am_i() << " sequence is " << ns.elem(pos) << endl;}int main(){ Fibonacci fib; cout << fib << endl << endl; Fibonacci fib2(6); cout << fib2 << endl << endl; Fibonacci fib3(5,8); cout << fib3 << endl; cout << fib3.elem(20) << endl; Triangular tri(2,5); cout << tri << endl; display(tri,20);}
版本二(5.7~5.10)
#include <iostream>#include <vector>#include <typeinfo>using namespace std;class num_sequence{public: virtual ~num_sequence() {};// virtual const char* what_am_i() const = 0; int elem(int pos) const; int length() const { return _length;} int beg_pos() const { return _beg_pos;} static int max_elem() { return _max_elems;} ostream& print(ostream &os = cout ) const; inline const char* what_am_i() const { return typeid(*this).name();}protected:// virtual void gen_elems(int pos) const = 0; bool check_integrity(int pos, int size) const; virtual void gen_elems(int pos) const = 0; const static int _max_elems = 25; num_sequence(int len, int bp, vector<int> &re ) : _length(len), _beg_pos(bp), _relems(re) {} int _length; int _beg_pos; vector<int> &_relems;};bool num_sequence::check_integrity(int pos,int size) const{ if (pos <= 0 || pos >= _max_elems) { cerr << "!! invalid position: " << pos << " Cannot honor request.\n"; return false; } if (pos > size) gen_elems(pos); return true;}int num_sequence::elem(int pos) const{ if (! check_integrity(pos,_relems.size())) return 0; return _relems[pos-1];}ostream& num_sequence::print(ostream &os) const{ int elem_pos = _beg_pos - 1; int end_pos = elem_pos + _length; if ( (unsigned)end_pos > _relems.size() ) gen_elems(end_pos); os << what_am_i() << " (" << length() << "," << beg_pos() << "): " ; while (elem_pos < end_pos) os << _relems[elem_pos++] << ' '; return os;}class Fibonacci:public num_sequence{public: Fibonacci( int len = 1, int beg_pos = 1) : num_sequence(len, beg_pos, _elems) {}// virtual const char* what_am_i() const { return "Fibonacci";}protected: virtual void gen_elems(int pos) const; static vector<int> _elems;};vector<int> Fibonacci::_elems;void Fibonacci::gen_elems(int pos) const{ if (_elems.empty()) { _elems.push_back(1);// cout << "gen_elems: 1\n"; _elems.push_back(1);// cout << "gen_elems: 1\n"; } if (_elems.size() <= (unsigned)pos) { int ix = _elems.size(); int n_2 = _elems[ix-2]; int n_1 = _elems[ix-1]; for(; ix < pos; ++ix) { int elem = n_2 + n_1;// cout << "gen_elems: " <<elem << endl; _elems.push_back(elem); n_2 = n_1; n_1 = elem; } }}class Triangular:public num_sequence{public: Triangular( int len = 1, int beg_pos = 1) : num_sequence(len, beg_pos, _elems) {}// virtual const char* what_am_i() const { return "Triangular";}protected: virtual void gen_elems(int pos) const; static vector<int> _elems;};vector<int> Triangular::_elems;void Triangular::gen_elems(int pos) const{ if (_elems.size() <= (unsigned)pos) { int ix = _elems.size() ? _elems.size()+1 : 1; for( ; ix <= pos; ++ix) { _elems.push_back(ix*(ix+1)/2);// cout << "gen_elems: " << *(--_elems.end()) << endl; } }}ostream& operator<<( ostream &os, const num_sequence &ns){ return ns.print( os);}inline void display(const num_sequence &ns, int pos, ostream &os = cout){ os << "The element at position " << pos << " for the " << ns.what_am_i() << " sequence is " << ns.elem(pos) << endl;}int main(){ Fibonacci fib; cout << fib << endl; Fibonacci fib2(6); cout << fib2 << endl; Fibonacci fib3(5,8); cout << fib3 << endl; Fibonacci fib4(fib3); Fibonacci fib5 = fib4; cout << fib5 << endl; Triangular tri(2,5); cout << tri << endl; display(tri,20);}
版本二中,return typeid(*this).name(),会分别返回"9Fibonacci","10Triangular",前面的数字表示的是后面字符串的长度....怎么去掉..不知.....
- Essential C++ 第五章代码
- Essential C++学习笔记------第五章
- Essential C++ 第二章代码
- Essential Silverlight翻译连载---第五章 交互和事件处理
- Essential Silverlight翻译连载---第五章 续1
- Essential Qt 第五章 记事本(二)简单事件处理
- essential c++ 第二章第一节的代码
- Essential c++ 第三章代码(有疑问)
- Essential.net 代码调试
- 快速阅读《Essential C++》
- Essential C++
- 重读《Essential C++》心得
- 垃圾《Essential C++》
- 《Essential C++》笔记1
- 读《essential c++》有感
- 《Essential C++》 基础知识
- 《Essential C++》碎片
- 《Essential C++》随笔一
- PhP 常见安装错误configure error xml2-config not found. please check your libxml2 installation
- Linux驱动程序笔记5——usb驱动概述1
- andengine的纹理参数代码分析
- HTML5 – 新旧语法简介
- Linux驱动程序笔记5——usb概述2
- Essential C++ 第五章代码
- 在Excel的单元格中产生随机数
- 字符串全排列问题分析
- spring mvc:处理表单上的多选框
- UML实践----用例图、顺序图、状态图、类图、包图、协作图
- 从海康7816的ps流里获取数据h264数据
- Dom4j 使用简介
- v8学习---使用内部字段给js添加全局变量
- leetcode String to Integer (atoi)