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; }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
问题 你想构建一个能支持迭代操作的自定义对象,并希望找到一个能实现迭代协议的简单方法。 解决方案 目前为止,在一个对象上实现迭代最简单的方式是使用一个生成器函数。 在4.2小节中,使用Node类来表示树形数据结构。你可能想实现一个以深度优先方式遍历树形节点的生成器。 下面是代码示例: class Node: def __init__(self, value): self._
本文向大家介绍Java中Set&List的迭代器实现步骤解析,包括了Java中Set&List的迭代器实现步骤解析的使用技巧和注意事项,需要的朋友参考一下 List Java 的list又分为 ArrayList 和 LinkedList ArrayList 从代码中我们不难看出迭代器维护上一次return的元素下边和下一个将要return的元素下标,并且迭代器在进行修改操作时会检查在本次操作与上
本文向大家介绍C#模拟MSN窗体抖动的实现代码,包括了C#模拟MSN窗体抖动的实现代码的使用技巧和注意事项,需要的朋友参考一下 基于C#实现窗体的抖动是件很有意思的事情,原理并不难,其实是生成随机数,然后改变Form的左上角的坐标即可。 这里用的是循环来实现的,其实还可以用timer来控制. 我把抖动分成了两种抖动: 1.生成随机数,改变窗体左上角坐标,然后立即把窗体的坐上角坐标还原,继续循环。
我正在解决以下问题: 迭代器设计模式具有很强的封装性。例如,一个图书馆想要一个图书管理系统。一个类用于存储它们的详细信息,一个类用于存储图书和书架号。假设图书馆想要使用将数据存储在数据库中。 如何使用JDBC实现迭代器设计模式以确保数据的封装? 我关心的是在哪里处理数据库以及如何在应用程序之间共享数据。 数据库处理程序可以是库类的内部类吗?那么是否可以保存数据并根据请求检索它而不影响封装? 我还在
迭代器模式(Iterator Pattern) 目前已经是一个没落的模式, 基本上没人会单独写一个迭代器, 除非是产品性质的开发, 其定义如下: 它提供一种方法访问一个容器对象中各个元素, 而又不需暴露该对象的内部细节。
本文向大家介绍Mybatis 传输List的实现代码,包括了Mybatis 传输List的实现代码的使用技巧和注意事项,需要的朋友参考一下 1. 当查询的参数只有一个时 1.1 如果参数的类型是List, 则在使用时,collection属性要必须指定为 list Xml代码 1.2 如果参数的类型是Array,则在使用时,collection属性要必须指定为 array Xml代码 2. 当