⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch6_main.cpp

📁 Essential C++ sampe code for Non-Windows environment
💻 CPP
字号:
/**************************************************
 * Essential C++ -- Stanley Lippman
 * Addison-Wesley 
 * ISBN 0-201-48518-4
 * homepage: www.objectwrite.com
 * email: slippman@objectwrite.com
 *************************************************/

#include <string>
#include <vector>
#include <utility>
#include <iostream>
using namespace std;

template <int len, int beg_pos> class num_sequence;

template <int len, int beg_pos>
ostream& operator<<( ostream &os, const num_sequence<len,beg_pos> &ns );

template <int len, int beg_pos>
class num_sequence {
public:
    virtual ~num_sequence(){};
			 
	int                 elem( int pos ) const;
    const char*         what_am_i() const;
	static  int         max_elems(){ return _max_elems; }
	ostream&            print( ostream &os = cout ) const; 
	
protected:
    virtual void        gen_elems( int pos ) const = 0;
	bool                check_integrity( int pos, int size ) const;
	num_sequence( vector<int> *pe ) : _pelems( pe ){}

	// static const int _max_elems = 1024; // ok, but vc++ doesn't accept
	enum { _max_elems = 1024 };
	vector<int>       *_pelems;
};

template <int len, int beg_pos>
ostream& operator<<( ostream &os, 
					 const num_sequence<len,beg_pos> &ns )
{  
    return ns.print( os );
}

template <int len, int beg_pos>
int num_sequence<len,beg_pos>::
elem( int pos ) const 
{
	    if ( ! check_integrity( pos, _pelems->size() ))
			 return 0;

		return (*_pelems)[ pos-1 ];
}

#include <typeinfo>

template <int length, int beg_pos>
const char* num_sequence<length, beg_pos>::
what_am_i() const 
{
    return typeid( *this ).name();
}

template <int length, int beg_pos>
bool num_sequence<length, beg_pos>::
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;
}

template <int length, int beg_pos>
ostream& num_sequence<length, beg_pos>::
print( ostream &os ) const
{
		
	int elem_pos = beg_pos-1;
	int end_pos = elem_pos + length;

    if ( ! check_integrity( end_pos, _pelems->size() ))
			 return os;

     os << "( "
	    << beg_pos << " , "
	    << length << " ) ";
   
	while ( elem_pos < end_pos )
		     os << (*_pelems)[ elem_pos++ ] << ' ';

	return os;
}

template <int length, int beg_pos=1>
class Fibonacci : public num_sequence<length, beg_pos> {
public:
   Fibonacci() : num_sequence<length,beg_pos>( &_elems ){}

protected:
   virtual void       gen_elems( int pos ) const;
   static vector<int> _elems;
};

template <int length, int beg_pos>
vector<int> Fibonacci<length,beg_pos>::_elems;

template <int length, int beg_pos>
void Fibonacci<length,beg_pos>::
gen_elems( int pos ) const
{   
	if ( pos <= 0 || pos > max_elems() )
		 return;

    if ( _elems.empty() )
       { _elems.push_back( 1 ); _elems.push_back( 1 ); }

    if ( _elems.size() < pos )
	{
		    int ix = _elems.size();
			int n_2 = _elems[ ix-2 ], 
				n_1 = _elems[ ix-1 ];

			int elem;
			for ( ; ix < pos; ++ix ){
				    elem = n_2 + n_1; 
					// cout << "gen_elems: " << elem << endl;
					_elems.push_back( elem );
					n_2 = n_1; n_1 = elem;
			}
	 }
}  


int main()
{
/*
fib1: ( 1 , 8 ) 1 1 2 3 5 8 13 21
fib2: ( 8 , 8 ) 21 34 55 89 144 233 377 610
fib3: ( 8 , 12 ) 21 34 55 89 144 233 377 610 987 1597 2584 4181
*/	
	
	Fibonacci<8>  fib1;
    Fibonacci<8,8> fib2;
    Fibonacci<12,8> fib3;

	cout << "fib1: " << fib1 << '\n'
	     << "fib2: " << fib2 << '\n'
		 << "fib3: " << fib3 << endl;

	return 0; // quiets vc++
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -