STL,迭代器的C++简单实现
[cpp]// Iterator.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <string>
#include <memory>
using namespace std;
// 对于C++,STL中已经包含迭代器的实现了
// 就不再单独造车轮了
// 部分代码见【STL源码剖析】
// 来一个智能指针的示意
namespace TEST
{
template<class T>
class auto_ptr
{
public:
// 显示构造函数
explicit auto_ptr(T *p = NULL) : pointee(p){}
template<class U>
auto_ptr(auto_ptr<U>& rhs) : pointee(rhs.release()){}
~auto_ptr() {delete pointee;}
template<class U>
auto_ptr<T>& operator=(auto_ptr<U>& rhs)
{
if (this != &rhs)
{
reset(rhs.release());
return *this;
}
}
T& operator*() const
{
return *pointee;
}
T* operator->() const
{
return pointee;
}
T* get() const
{
return pointee;
}
protected:
T* release()
{
T *p = new T;
memcpy(p, pointee, sizeof(T));
delete this;
return p;
}
void reset(T *p)
{
if (pointee)
{
delete pointee;
pointee = NULL;
}
pointee = p;
}
private:
T *pointee;
};
}
// 智能指针的示例
// 申请的内存不需要释放,没有内存泄露
void func()
{
TEST::auto_ptr<string> ps(new string("Hello"));
cout<< *ps <<endl;
cout<< ps->size() <<endl;
}
namespace TEST
{
template<typename T>
class ListItem
{
public:
ListItem(T vl)
: _value(vl)
, _next(NULL)
{
}
T value() const {return _value;}
ListItem *next() const {return _next;}
void SetNext(ListItem<T> *p){_next = p;}
private:
T _value;
ListItem *_next;
};
// 迭代器是一种智能指针
template<typename T>
class List
{
public:
List()
{
ListItem<T> *a = new ListItem<T>(0); // 没有析构哦
_front = a;
_front->SetNext(NULL);
_size = 0;
}
void insert_end(T value);
void display(std::ostream &os = std::cout) const;
ListItem<T> * front(){return _front;}
ListItem<T> * end()
{
ListItem<T> *end = _front;
while(1)
{
if (end->next())
{
end = end->next();
}
else
{
break;
}
}
return end;
}
private:
ListItem<T> *_front;
long _size;
};
template<typename T>
void TEST::List<T>::display( std::ostream &os /*= std::cout*/ ) const
{
ListItem<T> *end = NULL;
end = _front->next();
ListItem<T> *before = _front;
do
{
os<<end->value()<<endl;
end = end->next();
} while (end);
}
// 因为只保留了链表头,所以插入操作很纠结,比较失败
template<typename T>
void TEST::List<T>::insert_end( T value )
{
ListItem<T> *node = new ListItem<T>(value);
ListItem<T> *end = this->end();
&n
补充:软件开发 , C++ ,
上一个:PAT1046-Shortest Distance
下一个:合并有序链表
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊