📄 skipmap.hp
字号:
// This may look like C code, but it is really -*- C++ -*-/* Copyright (C) 1991 Free Software FoundationThis file is part of the GNU C++ Library. This library is freesoftware; you can redistribute it and/or modify it under the terms ofthe GNU Library General Public License as published by the FreeSoftware Foundation; either version 2 of the License, or (at youroption) any later version. This library is distributed in the hopethat it will be useful, but WITHOUT ANY WARRANTY; without even theimplied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULARPURPOSE. See the GNU Library General Public License for more details.You should have received a copy of the GNU Library General PublicLicense along with this library; if not, write to the Free SoftwareFoundation, 675 Mass Ave, Cambridge, MA 02139, USA.*//* * Bags implemented via William Pugh SkipList algorithms. * CACM, June 1990, p 668-676. * */#ifndef _<T><C>SkipMap_h#ifdef __GNUG__#pragma interface#endif#define _<T><C>SkipMap_h 1#include "<T>.<C>.Map.h"#include <values.h>#include <MLCG.h>class <T><C>SkipMap;class <T><C>RealSkipMapNode;class <T><C>SkipMapNode{friend class <T><C>SkipMap; private: <T><C>RealSkipMapNode * * forward; protected: <T><C>SkipMapNode(int size);};class <T><C>RealSkipMapNode : public <T><C>SkipMapNode{friend class <T><C>SkipMap; private: <T> item; <C> cont; <T><C>RealSkipMapNode(<T&> h, <C&> i, int size);};typedef <T><C>RealSkipMapNode* <T><C>SkipMapNodePtr;inline <T><C>SkipMapNode::<T><C>SkipMapNode(int size): forward(new <T><C>SkipMapNodePtr[size+1]){}inline <T><C>RealSkipMapNode::<T><C>RealSkipMapNode(<T&> h, <C&> i, int size): item(h), cont(i), <T><C>SkipMapNode(size){}class <T><C>SkipMap : public <T><C>Map{friend class <T><C>SkipMapinit; protected: <T><C>SkipMapNode* header; int level; int max_levels; int randoms_left; long random_bits; static MLCG* gen; int random_level(void); <T><C>SkipMapNodePtr leftmost(); <T><C>SkipMapNodePtr rightmost(); <T><C>SkipMapNodePtr pred(<T><C>SkipMapNodePtr t); <T><C>SkipMapNodePtr succ(<T><C>SkipMapNodePtr t); void _kill(); private: enum { BITS_IN_RANDOM = LONGBITS-1 }; public: <T><C>SkipMap( <C&> dflt, long size=DEFAULT_INITIAL_CAPACITY); <T><C>SkipMap(<T><C>SkipMap& a); ~<T><C>SkipMap(); <C>& operator [] (<T&> key); void del(<T&> key); Pix first(); void next(Pix& i); <T>& key(Pix i); <C>& contents(Pix i); Pix seek(<T&> key); int contains(<T&> key); void clear(); Pix last(); void prev(Pix& i); int OK();};inline <T><C>SkipMap::~<T><C>SkipMap(){ _kill(); delete header;}inline <T><C>SkipMapNodePtr <T><C>SkipMap::leftmost(){ return header->forward[0]==header ? 0 : header->forward[0];}inline Pix <T><C>SkipMap::first(){ return Pix(leftmost());}inline Pix <T><C>SkipMap::last(){ return Pix(rightmost());}inline <T><C>SkipMapNodePtr <T><C>SkipMap::succ(<T><C>SkipMapNodePtr t){ return t->forward[0]==header ? 0 : t->forward[0];}inline void <T><C>SkipMap::next(Pix& i){ if (i != 0) i = Pix(succ((<T><C>SkipMapNodePtr)i));}inline void <T><C>SkipMap::prev(Pix& i){ if (i != 0) i = Pix(pred((<T><C>SkipMapNodePtr)i));}inline <T>& <T><C>SkipMap::key (Pix i){ if (i == 0) error("null Pix"); return ((<T><C>SkipMapNodePtr)i)->item;}inline <C>& <T><C>SkipMap::contents (Pix i){ if (i == 0) error("null Pix"); return ((<T><C>SkipMapNodePtr)i)->cont;}inline int <T><C>SkipMap::contains(<T&> key){ return seek(key) != 0;}static class <T><C>SkipMapinit{ public: <T><C>SkipMapinit(); ~<T><C>SkipMapinit(); private: static int count;} <T><C>skipMapinit;#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -