《算法》一书中,在算法3.1中提到了Map的实现,这里根据书上的思想,用单向链表简单写了写。

#ifndef SEQUENTIAL_H
#define SEQUENTIAL_H
template<class K, class V>
class Link
{
private:
    class Node
    {
    public:
        K key=;
        V value=;
        Node *next=nullptr;
    public:
        Node(K, V, Node*);
        Node(){};
    };
private:
    Node *first;
    int _length;
    int _capicty;
public:
    Link();
    V& get(K key);
    void put(K key, V value);
    int Size() const;
    int Capicty() const;
    bool Delete(K key);
    ~Link();
};

template<class K, class V>
Link<K, V>::Node::Node(K key, V value, Node* node)
{
    this->key = key;
    this->value = value;
    next = node;
}
template<class K, class V>
V& Link<K, V>::get(K key)
{
    Node *x = first;
    ; i < _length&& x != nullptr; i++)
    {
        if (x->key == key) return x->value;
        x = x->next;
    }
}
//如果没有K,则在链表尾加入新的键值对
template<class K, class V>
void Link<K, V>::put(K key, V value)
{
    Node *x = first;
    bool flag = false;
    ; i < _length; i++)
    {
        if (x->key == key) { x ->value = value; flag = true; break; }
        x = x->next;
    }
    if (!flag)
    {
         >= _capicty)
        {
            Node *m = first;
            _capicty *= ;
            Node **n = new Node*[_capicty];
            ; i < _capicty; i++)
            {
                n[i] = new Node();
            }
            ; i < _capicty - ; i++)
            {
                n[i]->next = n[i + ];
            }
            ; i < _capicty && m!=nullptr; i++)
            {
                n[i] =  m;
                m = m->next;
            }
            delete[] first;
            first = n[];
        }
        int l = _length;
        Node *y = first;
        while (l)
        {
            y = y->next;
            l--;
        }
        y->value = value;
        y->key = key;
        y->next = y->next;
        _length++;
    }

}
template<class K, class V>
Link<K, V>::~Link()
{
    if (first != nullptr) delete[] first;
}
template<class K, class V>
Link<K, V>::Link()
{
    Node** n = ];
    _capicty = ;
    _length = ;
    ; i <  ; i++)
    {
        n[i] = new Node();
    }
    ; i < -; i++)
    {
        n[i]->next = n[i+];
    }
    first = n[];
}
template<class K, class V>
int Link<K, V>::Size() const
{
    return _length;
}

//当前链表容量
template<class K, class V>
int Link<K, V>::Capicty() const
{
    return _capicty;
}
template<class K, class V>
bool Link<K, V>::Delete(K key)
{
    bool flag = false;

    Node* n = first->next;
    Node* b = first;
    if (b->key == key)
    {
        _length--;
        first = first->next;
        return true;
    }
    ; i < _length; i++)
    {
        if (n->key == key)
        {
            b->next = n->next;
            _length--;
            flag = true;
            break;
        }
        b = b->next;
        n = n->next;
    }
    return flag;
}
#endif

C++链表与键值对的更多相关文章

  1. (转)C#中键值对类型Hashtable与Dictionary比较和相关用法

    最近在使用C#中的Hashtable与Dictionary的时候,想知道其区别,通过查找网络相关博客资料,作出下列总结. Hashtable与Dictionary虽然都是作为键值对的载体,但是采用的是 ...

  2. 浅谈Redis数据库的键值设计(转)

    丰富的数据结构使得redis的设计非常的有趣.不像关系型数据库那样,DEV和DBA需要深度沟通,review每行sql语句,也不像memcached那样,不需要DBA的参与.redis的DBA需要熟悉 ...

  3. JAVA中的数据结构——集合类(线性表:Vector、Stack、LinkedList、set接口;键值对:Hashtable、Map接口<HashMap类、TreeMap类>)

    Java的集合可以分为两种,第一种是以数组为代表的线性表,基类是Collection:第二种是以Hashtable为代表的键值对. ... 线性表,基类是Collection: 数组类: person ...

  4. 从源码看HashMap键值对集合

    之前我们看过了两种类型的集合,ArrayList集合和LinkedList集合,两种集合各有优势,我们不具体说了,但是本篇要看的集合可以完成它们完成不了的任务.比如:现有一篇文章,要你统计其中出现了哪 ...

  5. [Redis]Redis的五种数据类型与键值/服务器相关命令

    -------------------------------------------------------------------------------------- String(字符串):最 ...

  6. 数据结构(一): 键值对 Map

    Map基本介绍 Map 也称为:映射表/关联数组,基本思想就是键值对的关联,可以用键来查找值. Java标准的类库包含了Map的几种基本的实现,包括:HashMap,TreeMap,LinkedHas ...

  7. redis基础之基本键值操作和使用(三)

    前言 redis安装完毕后开始使用redis,先熟悉命令行操作. redis数据的类型 键:redis的所有的键都是string类型: 值:五种类型 string:字符串类型:一个string最大可以 ...

  8. [19/03/26-星期二] 容器_Map(图、键值对、映射)接口之HashMap(散列映射)&TreeMap(树映射)

    一.概念&方法 现实生活中,我们经常需要成对存储某些信息.比如,我们使用的微信,一个手机号只能对应一个微信账户,这就是一种成对存储的关系. Map就是用来存储“键(key)-值(value) ...

  9. 浅谈REDIS数据库的键值设计(转)

    add by zhj: 关系数据库表的一条记录可以映射成Redis中的一个hash类型,其实数据库记录本来就是键值对.这样,要比本文中的键设计用更少的键,更节省内存,因为每个键除了它的键值占用内存外, ...

随机推荐

  1. matlab操作之--读取指定文件夹下的“指定格式”文件

    %% 正负样本所在folder fext='*.png';%要读取的文件格式 positiveFolder='F:\课题\Crater detection\machingLearning\Positi ...

  2. 你的 Docker 应用是安全的吗?

    近一年来,Docker 已经逐渐成为 container 界的事实标准,成为技术人员不可或缺的技能之一,就像 Docker 宣称的那样,「Build,Ship,and Run Any App,Anyw ...

  3. 初级Oracle和SQL学习者的学习笔记。韩顺平-玩转oracle。

    我自己就是一个oracle和sql的初学者,前段时间看了韩顺平老师的oracle视频教程,觉得很深入浅出,收获了很多.同时自己也做了不少笔记,现在想将纸质笔记以自己的话总结出来.俗话说得好:教学总是相 ...

  4. 14.6.7 Configuring the Number of Background InnoDB IO Threads 配置InnoDB IO Threads的数量

    14.6.7 Configuring the Number of Background InnoDB IO Threads 配置InnoDB IO Threads的数量 InnoDB 使用后台线程来服 ...

  5. java 集合框架图

    Java平台提供了一个全新的集合框架.“集合框架”主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型. Java 2集合框架图集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架 ...

  6. Qt新建项目No valid kits found解决思路

    Qt新建项目No valid kits found解决思路 第一次用Qt Creator创建Project时,进入Kit Selection窗口后,会提示No Valid kits found. Pl ...

  7. 悟透Javascript undefined,null,"",0这四个值转换为逻辑值时就是false &this关键字

    话题一:undefined,null,"",0这四个值转换为逻辑值时就是false 也就是在if判断时会把上面的五个作为false来判断.但是它们的类型确是不尽相同的,如下所示. ...

  8. (转)ASP.NET MVC路由配置

    一.命名参数规范+匿名对象 1 routes.MapRoute(name: "Default", 2 url: "{controller}/{action}/{id}&q ...

  9. (转载)vsftpd简易配置

    (转载)http://licong.blog.51cto.com/542131/145748/ 写篇关于vsftp配置的文章,加深自己的记忆,便于自己查阅,同时也希望能给其他需要的朋友一点借鉴.本文如 ...

  10. XenServer的某台机器一直pending住怎么办

    XenServer某台VM在操作后,图标一直显示成黄色,无法完成操作,成假死的状态.可以用下面命令强制终止VM: 1.在你假死的机器获得UUID 2.在XenServer的控制台输入如下命令获得ID ...