64,691
社区成员
发帖
与我相关
我的任务
分享
#include <cstdlib>
#include <iostream>
#include <iterator>
using namespace std;
template <class T, size_t N =20 >
class Array {
private:
T *data;
size_t count;
size_t capacity;
public:
Array(){
count = 0;
data = new T[capacity = N];
}
~Array(){
delete []data;
}
void push_back(const T &t)
{
if(count == capacity)
{
T *newdata = new T[2*capacity];
for(int i=0; i<count; ++i)
newdata[i] = data[i];
delete data;
data = newdata;
capacity = 2*capacity;
data[count++] = t;
}
else
data[count++] = t;
}
void pop_back()
{
if(count > 0)
--count;
else
cout<<"count == 0"<<endl;
}
T* begin(){
return data;
}
T* end(){
return data+count;
}
};
template<class T, template<class,size_t N = 20> class seq >
class Container{
private:
seq<T> sq;
public:
void append(T &t)
{
sq.push_back(t);
}
T* begin(){
return sq.begin();
}
T* end(){
return sq.end();
}
};
int main()
{
Container<int,Array > con;
for(int i =10; i< 60; i += 10)
con.append(i);
//Array<T>::iterator it = con.begin();
int *it = con.begin();
for(; it!= con.end(); ++it)
cout<<*it<<endl;
return 1;
}
template< typename T >
class MyIterator : public std::iterator< std::random_access_iterator_tag, T >
{
public :
MyIterator( T* iter ) : _iter( iter ){}
T* operator ++ ( )
{
return ++_iter;
}
T& operator * ( )
{
return *_iter;
}
........ //随机迭代器其它各种运算的实现
private :
T* _iter;
};
............
template <class T, size_t N =20 >
class Array
{
public :
.........
typedef MyIterator< T > iterator;
typedef typename MyIterator< T >::value_type value_type;
typedef typename MyIterator< T >::iterator_category iterator_category;
typedef typename MyIterator< T >::reference reference;
typedef typename MyIterator< T >::difference_type difference_type;
typedef typename MyIterator< T >::pointer pointer;
};
typedef random_access_iterator_tag iterator_tag;
typedef T value_type;
typedef T* iterator;
typedef T& reference;
typedef ptrdiff_t difference_type;
这只是其中一种方法,还有另外一种方式 Array继承C++标准库汇中的: public iterator<random_access_struct_tag>,可是我继承的时候 编译器说不存在在iterator,可是我不知道stl库中的iterator到C++标准库中变成了什么。以下示例是通过第一种方法实现的,而第二种方式向大神请教
#include <cstdlib>
#include <iostream>
#include <iterator>
using namespace std;
template <class T, size_t N =20 >
class Array /*: public iterator<random_access_iterator_tag, T> */{
private:
T *data;
size_t count;
size_t capacity;
public:
Array(){
count = 0;
data = new T[capacity = N];
}
~Array(){
delete []data;
}
void push_back(const T &t)
{
if(count == capacity)
{
T *newdata = new T[2*capacity];
for(int i=0; i<count; ++i)
newdata[i] = data[i];
delete data;
data = newdata;
capacity = 2*capacity;
data[count++] = t;
}
else
data[count++] = t;
}
void pop_back()
{
if(count > 0)
--count;
else
cout<<"count == 0"<<endl;
}
T* begin(){
return data;
}
T* end(){
return data+count;
}
T* operator++()
{
this++;
return this;
}
typedef random_access_iterator_tag iterator_tag;
typedef T value_type;
typedef T* iterator;
typedef T& reference;
typedef ptrdiff_t difference_type;
};
template<class T,size_t N , template<class,size_t N = 20> class seq >
class Container{
private:
seq<T,N> sq;
public:
void append(T &t)
{
sq.push_back(t);
}
T* begin(){
return sq.begin();
}
T* end(){
return sq.end();
}
};
int main()
{
Container<int> con = Array;
for(int i =10; i< 60; i += 10)
con.append(i);
Array<int>::iterator it = con.begin();
for(; it!= con.end(); ++it)
cout<<*it<<endl;
return 1;
}
template <class T, size_t N >
class Array
.............
template<class T, size_t N = 20, template<class,size_t N > class seq = Array >
class Container
{
private:
seq< T, N > sq;
...........
int main( void )
......
Container<int, 30 > con;
........