2018.5.7 第一次接触模板编程
模板编程就类似于设计模式的工厂模式,可以接受多种类型的参数,达到复用。
程序结果:
仅为小测试,所以不用工程
#include <bits/stdc++.h>
#define rep( i , j , n ) for ( int i = int(j) ; i < int(n) ; ++i )
#define dew( i , j , n ) for ( int i = int(n-1) ; i > int(j) ; --i )
#define _PATH __FILE__ , __LINE__
typedef std::pair < int , int > P ;
using std::cin ;
using std::cout ;
using std::endl ;
using std::string ;
namespace YHL {
template< typename T >
class Node {
public:
T data ;
Node<T> *next ;
public:
explicit Node<T> () : data ( 0 ) , next ( nullptr ) {}
explicit Node<T> ( const T &_data , Node<T> *const _next = nullptr )
: data ( _data )
, next ( _next ) {}
~Node<T> () { next = nullptr ; }
friend std::ostream& operator << ( std::ostream &out
, const Node<T> &One ) {
out << One.data << " " ;
return out ;
}
} ;
template< typename T >
class My_iterator {
private:
Node<T> *ptr ;
public:
explicit My_iterator<T> () : ptr ( nullptr ) {}
explicit My_iterator<T> ( Node<T> *const _ptr = nullptr )
: ptr ( _ptr ) {}
~My_iterator () { ptr = nullptr ; }
Node<T>& operator* () {
return *ptr ;
}
Node<T>* operator-> () {
return ptr ;
}
inline void operator++ () {
if ( ptr ) ptr = ptr->next ;
}
inline void operator++ ( int ) {
if ( ptr ) ptr = ptr->next ;
}
bool operator != ( const My_iterator<T> &it ) const {
return ptr != it.ptr ;
}
} ;
template< typename T , typename Function >
void My_foreach ( T src , T des , Function work ) {
for ( ; src != des ; src++)
work ( *src ) ;
}
template< typename T >
class List {
private:
Node<T> *head , *tail ;
size_t _size ;
public:
explicit List () : head ( new Node<T> () ) , tail ( head ) , _size ( 0 ) {}
~List () noexcept {
clear () ;
if ( head != nullptr )
delete head ;
head = tail = nullptr ;
}
Node<T>* push_front ( const T &data ) {
Node<T> *One = new Node<T> ( data , head->next ) ;
if ( One->next == nullptr )
tail = One ;
head->next = One ;
++_size ;
return One ;
}
Node<T>* push_back ( const T &data ) {
Node<T> *One = new Node<T> ( data ) ;
tail->next = One ;
tail = One ;
++_size ;
return One ;
}
bool push_front ( const int *arr , const int len ) {
rep ( i , 0 , len )
push_front ( arr[i] ) ;
return true ;
}
bool push_back ( const int *arr , const int len ) {
rep ( i , 0 , len )
push_back ( arr[i] ) ;
return true ;
}
bool pop_front () {
Node<T> *it = head->next ;
if ( !it ) return false ;
if ( !it->next ) tail = head ;
head->next = it->next ;
delete it ;
it = nullptr ;
--_size ;
return true ;
}
bool pop_back () {
Node<T> *it = head ;
if ( !it->next ) return false ;
while ( it->next != tail )
it = it->next ;
delete tail ;
tail = nullptr ;
it->next = nullptr ;
--_size ;
return true ;
}
bool empty () {
return head == nullptr || head->next == nullptr ;
}
size_t size () const {
return _size ;
}
void clear () {
while ( _size ) pop_front () ;
}
My_iterator<T> begin () {
return My_iterator<T> ( head->next ) ;
}
My_iterator<T> end () {
// return My_iterator<T> ( nullptr ) ;
return My_iterator<T> ( tail->next ) ;
}
void display () const {
cout << "size : " << size () << "\t" ;
Node<T> *it = head ;
while ( it->next ) {
cout << *it->next ;
it = it->next ;
}
cout << endl ;
}
} ;
}
int main () {
using YHL::List ;
using YHL::My_iterator ;
List<int> One ;
One.push_back ( 1 ) ;
One.push_back ( 0 ) ;
One.push_back ( 2 ) ;
One.push_back ( 2 ) ;
One.display () ;
int arr[4] = { 8 , 9 , 9 , 1 } ;
One.push_front ( arr , 4 ) ;
One.display () ;
One.clear () ;
int arr1[4] = { 8 , 9 , 9 , 1 } ;
One.push_back ( arr1 , 4 ) ;
One.display () ;
rep ( i , 0 , 6 ) {
One.pop_front () ;
One.display () ;
}
int arr2[10] = { 12 , 5 , 3 , 20 , 9 , 11 , 7 , 4 , 2 , 1 } ;
One.push_back ( arr2 , 10 ) ;
One.display () ;
cout << endl << "开始测试 auto 迭代器 : " << endl << endl ;
for ( const auto &it : One )
cout << it << " " ;
cout << endl << endl ;
for ( auto it : One )
cout << it << " " ;
cout << endl << endl ;
for ( auto &it : One )
cout << it << " " ;
cout << endl << endl ;
cout << "开始测试 My_iterator 迭代器 : " << endl << endl ;
YHL::My_iterator<int> it = One.begin () ;
for ( ; it != One.end () ; ++it )
cout << *it << " " ;
cout << endl << endl ;
cout<< "开始测试 My_foreach 表达式 : " << endl << endl ;
YHL::My_foreach ( One.begin () , One.end () ,
[] ( const YHL::Node<int> One) { cout << One << " " ; } ) ;
return 0 ;
}
如有错误,敬请指正。