#include <iostream>
template <typename KEY, typename VALUE>
class SkipListNode
{
public:
typedef SkipListNode<KEY, VALUE> NodeType;
SkipListNode()
: right(nullptr)
, down(nullptr)
{}
NodeType* right;
NodeType* down;
KEY first;
VALUE second;
};
template <typename KEY, typename VALUE>
class SkipList
{
private:
typedef SkipListNode<KEY, VALUE> NodeType;
public:
typedef const NodeType* const_iterator;
typedef KEY Key;
typedef VALUE Value;
SkipList()
: d_topLeft(nullptr)
, d_bottomLeft(nullptr)
, d_bottomRight(nullptr)
{}
const_iterator begin() const { return d_bottomLeft; }
const_iterator end() const { return d_bottomRight; }
void insert(const Key& key, const Value& value);
private:
NodeType* d_topLeft;
NodeType* d_bottomLeft;
NodeType* d_bottomRight;
};
template <typename KEY, typename VALUE>
void SkipList<KEY, VALUE>::insert(const KEY& key, const VALUE& value)
{
NodeType* node = new NodeType();
node->first = key;
node->second = value;
if (!d_topLeft) {
d_topLeft = node;
}
}
template <typename List>
void printList(const List& list)
{
for (typename List::const_iterator it = list.begin();
it != list.end();
++it) {
std::cout << "[ " << it->first << ", " << it->second << " ] ";
}
std::cout << "\n";
}
void insertAndIterate()
{
SkipList<int, int> list;
list.insert(2, 5);
printList(list);
}
int main() {
insertAndIterate();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIEtFWSwgdHlwZW5hbWUgVkFMVUU+CmNsYXNzIFNraXBMaXN0Tm9kZQp7CnB1YmxpYzoKICAgIHR5cGVkZWYgU2tpcExpc3ROb2RlPEtFWSwgVkFMVUU+IE5vZGVUeXBlOwogICAgCiAgICBTa2lwTGlzdE5vZGUoKQogICAgOiByaWdodChudWxscHRyKQogICAgLCBkb3duKG51bGxwdHIpCiAgICB7fQoKICAgIE5vZGVUeXBlKiByaWdodDsKICAgIE5vZGVUeXBlKiBkb3duOwogICAgS0VZICAgICAgIGZpcnN0OwogICAgVkFMVUUgICAgIHNlY29uZDsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBLRVksIHR5cGVuYW1lIFZBTFVFPgpjbGFzcyBTa2lwTGlzdAp7CnByaXZhdGU6CiAgICB0eXBlZGVmIFNraXBMaXN0Tm9kZTxLRVksIFZBTFVFPiBOb2RlVHlwZTsKICAgIApwdWJsaWM6CiAgICB0eXBlZGVmIGNvbnN0IE5vZGVUeXBlKiBjb25zdF9pdGVyYXRvcjsKICAgIHR5cGVkZWYgS0VZICAgICAgICAgICAgIEtleTsKICAgIHR5cGVkZWYgVkFMVUUgICAgICAgICAgIFZhbHVlOwogICAgCiAgICBTa2lwTGlzdCgpCiAgICA6IGRfdG9wTGVmdChudWxscHRyKQogICAgLCBkX2JvdHRvbUxlZnQobnVsbHB0cikKICAgICwgZF9ib3R0b21SaWdodChudWxscHRyKQogICAge30KICAgIAogICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBkX2JvdHRvbUxlZnQ7IH0KICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpICAgY29uc3QgeyByZXR1cm4gZF9ib3R0b21SaWdodDsgfQogICAgCiAgICB2b2lkIGluc2VydChjb25zdCBLZXkmIGtleSwgY29uc3QgVmFsdWUmIHZhbHVlKTsKCnByaXZhdGU6CiAgICBOb2RlVHlwZSogZF90b3BMZWZ0OwogICAgTm9kZVR5cGUqIGRfYm90dG9tTGVmdDsKICAgIE5vZGVUeXBlKiBkX2JvdHRvbVJpZ2h0Owp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIEtFWSwgdHlwZW5hbWUgVkFMVUU+CnZvaWQgU2tpcExpc3Q8S0VZLCBWQUxVRT46Omluc2VydChjb25zdCBLRVkmIGtleSwgY29uc3QgVkFMVUUmIHZhbHVlKQp7CglOb2RlVHlwZSogbm9kZSA9IG5ldyBOb2RlVHlwZSgpOwoJbm9kZS0+Zmlyc3QgPSBrZXk7Cglub2RlLT5zZWNvbmQgPSB2YWx1ZTsKCQoJaWYgKCFkX3RvcExlZnQpIHsKCQlkX3RvcExlZnQgPSBub2RlOwoJfQp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgTGlzdD4Kdm9pZCBwcmludExpc3QoY29uc3QgTGlzdCYgbGlzdCkKewoJZm9yICh0eXBlbmFtZSBMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGxpc3QuYmVnaW4oKTsKCSAgICAgaXQgIT0gbGlzdC5lbmQoKTsKCSAgICAgKytpdCkgewoJCXN0ZDo6Y291dCA8PCAiWyAiIDw8IGl0LT5maXJzdCA8PCAiLCAiIDw8IGl0LT5zZWNvbmQgPDwgIiBdICI7Cgl9CgkKCXN0ZDo6Y291dCA8PCAiXG4iOwp9Cgp2b2lkIGluc2VydEFuZEl0ZXJhdGUoKQp7CglTa2lwTGlzdDxpbnQsIGludD4gbGlzdDsKCWxpc3QuaW5zZXJ0KDIsIDUpOwoJcHJpbnRMaXN0KGxpc3QpOwp9CgppbnQgbWFpbigpIHsKCWluc2VydEFuZEl0ZXJhdGUoKTsKCQoJcmV0dXJuIDA7Cn0=