C++ 模拟实现list(迭代器)实现代码

C++ 模拟实现list(迭代器)

实现代码:

#pragma once;
#include <assert.h>
#include<iostream>
#include <assert.h>
using namespace std;
template<class T>
struct __ListNode
{
   T _data;
   __ListNode<T>* _next;
   __ListNode<T>* _prev;
   __ListNode(const T& x)
     :_data(x)
     ,_next(NULL)
     ,_prev(NULL)
   {
   }
};
template <class T,class Ref,class Ptr >
struct __ListIterator
{
  typedef __ListNode<T>  Node;
  typedef __ListIterator<T,Ref,Ptr> Self;
__ListIterator(Node* node)
    :_node(node)
  {
  }
  Ref operator*()
  {
    return _node->_data;
  }
  Ptr operator->()
  {
    return &(_node->_data)
  }
  Self& operator++()
  {
    _node=_node->_next;
    return *this;
  }
  Self& operator--()
  {
    _node=_node->_prev;
    return *this;
  }
  Self operator++(int)
  {
    Self tmp=_node;
    _node=_node->_next;
    //return tmp;
    return Self(tmp)
  }
  Self operator--(int)
  {
    Self tmp=(*this);
    _node=_node->_prev;
    return tmp;
  }
  bool operator!=(const Self& s) const
  {
   return this->_node!=s._node;
  }
  bool operator==(const Self& s) const
  {
    return this->_node==s._node;
  }
  Node* _node;
};
template<class T>
struct List
{
  typedef __ListNode<T> Node;
public:
  typedef __ListIterator<T,T&,T*> Iterator;
  typedef __ListIterator<T,const T&,const T*> ConstIterator;
  Node* GetNode(const T& x)
  {
    return new Node(x);
  }
  List()
  {
    _head=GetNode(T());
    _head->_next=_head;
    _head->_prev=_head;
  }
  Iterator Begin()
  {
   return Iterator(_head->_next);
  }
  Iterator End()
  {
   return Iterator(_head);
  }
  ConstIterator Begin() const
  {
    return ConstIterator(_head->_next);
  }
  ConstIterator End() const
  {
    return ConstIterator(_head);
  } 

  void PushBack(const T& x)
  {
   /* Node* _tail=_head->_prev;
    Node* tmp=GetNode(x);
    _tail->_next=tmp;
    tmp->_prev=_tail;
    tmp->_next=_head;
    _head->_prev=tmp;*/
    Insert(End(),x);
  }
 void PopBack()
 {
   /* assert(_head->_prev );
   Node* tail=_head->_prev;
   Node* prev=tail->_prev;
   Node* next=tail->_next;
   prev->_next=next;
   next->_prev=prev;
   delete tail;*/
   Erase(--End());
 }
 void PushFront(const T& x)
 {
  /*assert(_head)
   Node* tmp=GetNode(x);
   Node* next=_head->_next; 

   _head->_next=tmp;
   tmp->_prev=_head; 

   tmp->_next=next;
    next->_prev=tmp;*/
   Insert(Begin(),x);
 }
 void PopFront()
 {
   /*assert(_head->_next);
   Node* tmp=_head->_next;
   Node* next=tmp->_next; 

   _head->_next= next;
   next->_prev=_head;
   delete tmp;*/ 

    Erase(Begin());
 }
 Iterator Insert(Iterator pos, const T& x)
 {
   assert(pos._node);
   Node* tmp=GetNode(x);
   Node* cur=pos._node;
   Node* prev=cur->_prev; 

   prev->_next=tmp;
   tmp->_prev=prev;
   tmp->_next=cur;
   cur->_prev=tmp;
   return tmp;
 }
 Iterator Erase(Iterator pos)
{
assert(pos._node && pos._node!=NULL);
Node* tmp=pos._node;
Node* next=tmp->_next;
Node* prev=tmp->_prev; 

next->_prev=prev;
prev->_next=next; 

delete tmp;
return Iterator(next);
} 

protected:
  Node* _head;
};
void PrintList(const List<int>& l)
{
  List<int>::ConstIterator It=l.Begin();
  while(It!=l.End())
  {
    cout<<*It<<" ";
    ++It;
  }
  cout<<endl;}
 void TestList2()
{
  List<int> l2; 

  l2.PushBack(1);
  l2.PushBack(2);
  l2.PushBack(3);
  l2.PushBack(4);
  l2.PopBack();
  l2.PopBack();
   l2.PopBack();
   l2.PopBack();
    l2.PopBack();
  PrintList(l2);
}
void TestList3()
{
  List<int> l3;
  l3.PushFront(1);
  l3.PushFront(2);
  l3.PushFront(3);
  l3.PushFront(4);
  l3.PopFront();
  l3.PopFront();
  l3.PopFront();
  PrintList(l3); 

}
#include "List.h" 

int main()
{
  //TestList1();
   //TestList2();
   TestList3();
  return 0;
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • C++ 中CListCtrl的每个项都显示不同的提示信息

    C++ 中CListCtrl的每个项都显示不同的提示信息 添加CToolTipCtrl成员变量m_toolTipCtrl,CListCtrl成员变量m_ListUser,CImageList成员变量m_imageList(这个可以不要) 在OnInitDialog()函数里加下面代码 m_BoradcastEnd.EnableWindow(FALSE); m_imageList.Create(32, 32, ILC_COLOR8, 2, 2); DWORD dwStyle = m_ListUse

  • C++中CSimpleList的实现与测试实例

    本文实例讲述了C++简单列表类的实现方法.分享给大家供大家参考.具体方法如下: _AFXTLS.CPP文件如下: //#include "StdAfx.h #include <stddef.h> #include <stdio.h> #include "_AFXTLS_.H" struct MyThreadData{ MyThreadData* pNext; int nShortData; }; void CSimpleList::AddHead(vo

  • C++ STL入门教程(2) list双向链表使用方法(附程序代码)

    一.简介 "Unlike other standard sequence containers, list and forward_list objects are specifically designed to be efficient inserting and removing elements in any position, even in the middle of the sequence." Lists将元素按顺序储存在链表中.与向量(vector)相比, 它允许快速

  • C++中 STL list详解及简单实例

    C++中 STL list详解 1.List: 内部实现是一个双向链表,可以高效的进行插入删除,但不能够进行随机访问 2..示例程序: #include "stdafx.h" #include <iostream> #include <list> #include <iterator> #include <algorithm> using namespace std; const int num[5] = {1,3,2,4,5}; boo

  • C++ list的实例详解

     C++ list的实例详解 Source: #include <iostream> #include <list> #include <numeric> #include <algorithm> using namespace std; typedef list<int> LISTINT; //创建一个list容器的实例LISTINT typedef list<int> LISTCHAR; //创建一个list容器的实例LISTCH

  • C++ 使用模板实现一个List的实例

    C ++使用模板写的一个List template<class T> class List { private: struct Node { T data; Node *next; }; //head Node *head; //size int length; //process Node *p; //temp Node *q; public: List() { head = NULL; length = 0; p = NULL; } void add(T t) { if(head == N

  • C++语言 STL容器list总结

    在使用std::list<>链表时,难免会对数据进行添加删除操作.而遍历链表则有两种方式:通过索引访问,象数组一样处理:通过std::list<>::iterator链表遍历器进行访问 STL 中的list 就是一 双向链表,可高效地进行插入删除元素. list不支持随机访问.所以没有 at(pos)和operator[]. list 对象list1, list2 分别有元素list1(1,2,3),list2(4,5,6) .list< int>::iterator

  • C++中list的使用方法及常用list操作总结

    C++中list的使用方法及常用list操作总结 一.List定义: List是stl实现的双向链表,与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.使用时需要添加头文件 #include <list> 二.List定义和初始化: list<int>lst1;          //创建空list     list<int> lst2(5);       //创建含有5个元素的list     list<int>lst3(3,2

  • C++ 模拟实现list(迭代器)实现代码

    C++ 模拟实现list(迭代器) 实现代码: #pragma once; #include <assert.h> #include<iostream> #include <assert.h> using namespace std; template<class T> struct __ListNode { T _data; __ListNode<T>* _next; __ListNode<T>* _prev; __ListNode

  • C++模拟实现List迭代器详解

    目录 概念 迭代器使用 迭代器模拟实现 迭代器的大体结构 构造函数 解引用重载 重载 自增实现 自减实现 运算符重载 迭代器失效 模拟List 概念 迭代器是一种抽象的设计概念,其定义为:提供一种方法,使他能够按顺序遍历某个聚合体(容器)所包含的所有元素,但又不需要暴露该容器的内部表现方式. 迭代器是一种行为类似智能指针的对象, 而指针最常见的行为就是内 容提领和成员 访问. 因此迭代器最重要的行为就是对operator*和operator->进行重载. STL的中心思想在于: 将数据容器和算法

  • C++模拟实现vector的示例代码

    目录 一.迭代器 定义 普通迭代器 const类型迭代器 二.构造类 构造函数 拷贝构造函数 赋值运算符重载 析构函数 三.容量相关操作 size.capacity empty resize reserve 三.元素访问 [ ]重载 front back 四.修改类接口 push_back pop_back insert erase clear swap 五.成员变量 一.迭代器 定义 vector类型的迭代器就是原生态的指针,对T*进行重命名即可 typedef T* iterator; ty

  • C++模拟实现string的示例代码

    目录 一.std::swap和std::string::swap的区别 二.string的默认构造函数 1.构造函数 2.拷贝构造 3.赋值运算符重载 4.析构函数 三.string中的小接口 四.遍历接口的实现 1.对operator[]进行重载 2.迭代器 五.reserve和resize 六.插入删除查找相关接口 1.push_back.append.+= 2.insert和earse 3.find 七.流插入和流提取 八.模拟实现的string整体代码 一.std::swap和std::

  • jquery实现模拟百分比进度条渐变效果代码

    本文实例讲述了jquery实现模拟百分比进度条渐变效果代码.分享给大家供大家参考,具体如下: 这里为了便于看到加载百分比,对代码进行了处理,实际使用时并不需要这样. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-mn-bfb-scroll-cha-style-demo/ 具体代码如下: <html> <head> <title>jquery模拟百分比进度条</title> <script

  • jQuery模拟爆炸倒计时功能实例代码

     HTML部分  <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>炸弹倒计时</title> <style type="text/css"> .content { width: 200px; margin:0 auto; } .content .img1 { /*添加炸弹动

  • python编程使用selenium模拟登陆淘宝实例代码

    selenium简介 selenium 是一个web的自动化测试工具,不少学习功能自动化的同学开始首选selenium ,相因为它相比QTP有诸多有点: * 免费,也不用再为破解QTP而大伤脑筋 * 小巧,对于不同的语言它只是一个包而已,而QTP需要下载安装1个多G 的程序. * 这也是最重要的一点,不管你以前更熟悉C. java.ruby.python.或都是C# ,你都可以通过selenium完成自动化测试,而QTP只支持VBS * 支持多平台:windows.linux.MAC ,支持多浏

  • python爬虫之模拟登陆csdn的实例代码

    python模拟登陆网页主要使用到urllib.urllib2.cookielib及BeautifulSoup等基本模块,当然进阶阶段我们还可以使用像requests等更高级一点的模块.其中BeautifulSoup模块在匹配html方面,可以很好的代替re,使用起来更方便,对于不会使用正则的人来说是福音. 本文使用python2.7 原理 模拟登陆前,我们需要先知道csdn是如何登陆的.我们通过google chrome浏览器先来分析下: 1.chrome浏览器用F12或ctrl+shift+

  • Java 实现模拟用户登录的示例代码

    创建一个用户类类型的集合,手动输入用户库 主要是判定输入的用户名和密码是否与库中的匹配 做好区别是用户名输入错误还是密码输入错误的提示. 定义用户类 public class User{ String username; String keyword; public User(String username, String keyword) { this.username = username; this.keyword = keyword; } } 主程序 import java.util.A

  • Java 模拟数据库连接池的实现代码

    前面学习过等待 - 通知机制,现在我们在其基础上添加一个超时机制,模拟从连接池中获取.使用和释放连接的过程.客户端获取连接的过程被设定为等待超时模式,即如果在 1000 毫秒内无法获取到可用连接,将会返回给客户端一个 null.设定连接池的大小为 10 个,然后通过调节客户端的线程数来模拟无法获取连接的场景 由于 java.sql.Connection 只是一个接口,最终实现是由数据库驱动提供方来实现,考虑到本例只是演示,我们通过动态代理构造一个 Connection,该 Connection

随机推荐