首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++】STL 容器 - list 双向链表容器 ② ( list 常用 api 简介 | 首尾 添加 删除 元素 | 获取首尾元素 | 正向迭代与反向迭代 )

文章目录 一、元素操作 1、首尾 添加 / 删除 元素 2、获取 首尾 元素 二、迭代器遍历容器 1、正向迭代与反向迭代 2、代码示例 一、元素操作 1、首尾 添加 / 删除 元素 list 双向链表容器...(); // 删除尾部元素 lstInt.pop_back(); 上述函数都接受常量引用作为参数( 对于 push_back 和 push_front )或 没有参数(对于 pop_back 和 pop_front..., 崩溃退出 ; reference back(); const_reference back() const; 代码示例 : // list 双向链表容器 使用初始化列表构造 list<int...二、迭代器遍历容器 1、正向迭代与反向迭代 std::list 双向链表容器 提供了 begin、end、rbegin 和 rend 这几个成员函数,用于 获取 迭代访问链表中的元素 的 迭代器 , 函数原型如下...返回一个迭代器 , 指向链表的尾部 , 该尾部指的是 超出链表末尾 的位置 , 不是最后一个元素 , 是最后一个元素后面的位置 , 无法获取值 ; iterator end(); const_iterator

34410

LinkedHashMap的实现原理(复习)

LinkedHashMap重写了父类HashMap的get方法,实际在调用父类getEntry()方法取得查找的元素后,再判断当排序模式accessOrder为true时,记录访问顺序,将最新访问的元素添加到双向链表的表头...由于的链表的增加、删除操作是常量级的,故并不会带来性能的损失。 Java代码   ?...,并将最新访问的元素添加到链表表头。  ...该方法可以提供在每次添加新条目时移除最旧条目的实现程序,默认返回false,这样,此映射的行为将类似于正常映射,即永远不能移除最旧的元素。 Java代码   ?...如果用此映射构建LRU缓存,则非常方便,它允许映射通过删除旧条目来减少内存损耗。    例如:重写此方法,维持此映射只保存100个条目的稳定状态,在每次添加新条目时删除最旧的条目。

66940
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    理解LinkedHashMap

    LinkedHashMap重写了父类HashMap的get方法,实际在调用父类getEntry()方法取得查找的元素后,再判断当排序模式accessOrder为true时,记录访问顺序,将最新访问的元素添加到双向链表的表头...,并将最新访问的元素添加到链表表头。...该方法可以提供在每次添加新条目时移除最旧条目的实现程序,默认返回false,这样,此映射的行为将类似于正常映射,即永远不能移除最旧的元素。...如果用此映射构建LRU缓存,则非常方便,它允许映射通过删除旧条目来减少内存损耗。 例如:重写此方法,维持此映射只保存100个条目的稳定状态,在每次添加新条目时删除最旧的条目。...LinkedHashMap通过继承hashMap中的Entry,并添加两个属性Entry before,after,和header结合起来组成一个双向链表,来实现按插入顺序或访问顺序排序

    55910

    linux内核里的字符串转换 ,链表操作常用函数(转)

    1.对双向链表的具体操作如下: list_add ———向链表添加一个条目   list_add_tail ———添加一个条目到链表尾部   __list_del_entry ———从链表中删除相应的条目...  list_replace———用新条目替换旧条目   list_del_init———从链表中删除条目后重新初始化   list_move———从一个链表中删除并加入为另一个链表的头部   list_move_tail...———反向遍历链表   list_for_each_safe———遍历链表并删除链表中相应的条目   list_for_each_prev_safe———反向遍历链表并删除链表中相应的条目   list_for_each_entry...———继续遍历链表并删除链表中相应的条目   list_for_each_entry_safe_from———从当前点遍历链表并删除链表中相应的条目   list_for_each_entry_safe_reverse...———反向遍历链表并删除链表中相应的条目   list_safe_reset_next———获得下一个指定类型的条目   hlist_for_each_entry———遍历指定类型的单指针表头链表

    2.4K20

    漫谈 LevelDB 数据结构(三):LRU 缓存( LRUCache)

    经典解法是使用一个哈希表(unordered_map)和一个双向链表,哈希表解决索引问题,双向链表维护访问顺序。...两个链表 LevelDB 使用两个双向链表保存数据,缓存中的所有数据要么在一个链表中,要么在另一个链表中,但不可能同时存在于两个链表中。这两个链表分别是: in-use 链表。...所有已经不再为客户端使用的条目都放在 lru 链表中,该链表按最近使用时间有序,当容量不够用时,会驱逐此链表中最久没有被使用的条目。...LRUHandle lru_ GUARDED_BY(mutex_); // in-use 双向链表的空表头 // 保存所有仍然被客户端引用的条目 // 由于在被客户端引用的同时还被缓存引用...每个双向链表使用了一个空的头指针,以便于处理边界情况。并且表头的 prev 指针指向最新的条目,next 指针指向最老的条目,从而形成了一个双向环形链表。

    1.1K30

    技术经验|Java基础之集合

    ,当集合中包含了一个或多个元素 o 时,该方法只删除第一个符合条件的元素,该方法将返回 true。...super E> filter)Java8新增,增加断言过滤删除。移除此集合中满足给定谓词的所有元素。迭代期间或谓词抛出的错误或运行时异常被中继到调用方。...LinkedList:基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。...LinkedHashSet:具有 HashSet 的查找效率,且内部使用双向链表维护元素的插入顺序。MapTreeMap:基于红黑树实现。 HashMap:基于哈希表实现。...LinkedHashMap:使用双向链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。 2.4 集合的优点那么集合在使用过程中,有哪些优点呢?

    16450

    【Java入门提高篇】Day28 Java容器类详解(十)LinkedHashMap详解

    此实现与 HashMap 的不同之处在于它维护了一个贯穿其所有条目的双向链表。 * 此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序)。...与HashMap一样,假设哈希函数在桶之间正确地分散元素,它将为基本操作(添加,包含和删除)提供了恒定时间 * 性能,由于维护链表的额外费用,性能可能略低于HashMap的性能,但有一个例外: *...这最好在创建时完成, * 以防止意外地不同步访问地图: * Map m = Collections.synchronizedMap(new LinkedHashMap(...)); * * 结构修改是指任何添加或删除一个或多个映射的操作...在将新条目插入Map后,put 和 putAll 将调用此方法。 * 它为实现者提供了在每次添加新条目时删除最旧条目的机会。...* * 示例:此覆盖实现将允许map增长到100个条目, * 然后在每次添加新条目时删除最旧的条目,保持100个条目的稳定状态。

    1K20

    【数据结构C语言】深入理解 双向链表

    插入和删除操作:在双向链表中插入或删除节点通常比单向链表更加高效,因为我们可以直接访问要插入或删除节点的前一个和/或后一个节点,从而避免了对链表的遍历。...phead->prev = newnode; } 4.双向链表的头删 双向链表头删 头删就是将双向链表第一个有效节点删除 (头删的前提是链表至少存在一个有效节点) 首先创建一个指针del指向要删除的节点...del->next; free(del);//释放节点空间 del = NULL; } 5.双向链表的尾删 双向链表尾删 尾删就是将双向链表的最后一个有效节点删除 (尾删的前提是至少存在一个有效节点...当缓存满时,最久未使用的项(即链表尾部的项)将被删除。 双向队列:双向链表也可以用作双向队列(Deque),支持从队列的前端和后端添加和删除元素。...撤销/重做功能:在文本编辑器或图形编辑器中,双向链表可以用于实现撤销和重做功能。每当用户执行一个操作时,该操作可以作为一个节点添加到链表的前端。

    16510

    我用几个bit实现了LRU,你不好奇吗?

    常规的LRU算法实现 常见的LRU使用哈希链表实现,哈希链表是双向链表和哈希表的结合体。...查询时,利用哈希表,可以在O(1)的复杂度下快速找到某个key是否在缓存(链表)并读取出值;每次访问后,会将缓存条目移动到链表头。...这样,最近一直没有访问的数据就会处于链表尾部,发生缓存置换时,删除链表尾部的数据,并将新数据写入链表头部。 为什么使用双向链表,使用单向链表有什么问题吗?...使用双向链表是为了在移动缓存数据到表头的复杂度为O(1)。...移动缓存数据在链表中的位置等价于先把节点删除,再把节点移动到表头位置,删除时,我们需要同时知道节点的前驱节点和后驱节点分别是哪个,才能将他们相连。

    53020

    详解LRU缓存算法

    向缓存添加数据时,如果缓存已满,则需要删除访问时间最早的那条数据,这种更新缓存的方法就叫做LRU。...这可以通过HashMap+双向链表实现。HashMap保证通过key访问数据的时间为O(1),双向链表则按照访问时间的顺序依次穿过每个数据。...之所以选择双向链表而不是单链表,是为了可以从中间任意结点修改链表结构,而不必从头结点开始遍历。 如下图所示,黑色部分为HashMap的结构,红色箭头则是双向链表的正向连接(逆向连接未画出)。...我们只需要在每次访问过后改变链表的连接顺序即可。 ? HashMap+双向链表 实现代码如下: ? ? ? ? ? 每个方法和成员变量前都有中文注释,不必过多解释。...该类内部也是采用HashMap+双向链表实现的。使用这个类实现LRU就简练多了。 ? ?

    62720

    详解LRU缓存算法

    向缓存添加数据时,如果缓存已满,则需要删除访问时间最早的那条数据,这种更新缓存的方法就叫做LRU。...这可以通过HashMap+双向链表实现。HashMap保证通过key访问数据的时间为O(1),双向链表则按照访问时间的顺序依次穿过每个数据。...之所以选择双向链表而不是单链表,是为了可以从中间任意结点修改链表结构,而不必从头结点开始遍历。 如下图所示,黑色部分为HashMap的结构,红色箭头则是双向链表的正向连接(逆向连接未画出)。...我们只需要在每次访问过后改变链表的连接顺序即可。 HashMap+双向链表 实现代码如下: 每个方法和成员变量前都有中文注释,不必过多解释。...该类内部也是采用HashMap+双向链表实现的。使用这个类实现LRU就简练多了。

    1.1K30

    深入剖析LinkedList:揭秘底层原理

    动态大小:LinkedList没有固定的容量限制,可以根据需要动态地添加或删除元素,并且不会出现数组扩容的情况。...通过这样的设计,LinkedList可以通过Node节点来构建双向链表结构,实现了在任意位置进行节点的插入和删除操作。...2.2 LinkedList实现了双向链表的原因Java中的LinkedList实现了双向链表是因为双向链表具有以下优点:双向链表可以从前向后或从后向前遍历,而单向链表只能从前往后遍历,这使得双向链表更加灵活和高效...双向链表相对于单向链表来说,其插入和删除节点的操作更加高效,因为只需要改变前后节点的指针指向即可,而单向链表需要先找到前驱节点再进行操作。...因此,双向链表在实现一些需要频繁插入和删除操作的场景下,比单向链表更加适用。

    10510

    【探索数据结构】线性表之双链表

    2)按循环性分双向循环链表:在双向链表的基础上,将头结点的后驱指针指向尾节点,尾节点的前驱指针指向头结点,从而形成一个双向环。...pos理论上来说不能为phead,但是没有参数phead,无法增加校验// 删除指定节点void LTErase(LTNode* pos){ assert(pos);//pos->next pos...= phead){//先把要删除节点的下一个节点存起来//不然要删除后续节点无法被找到LTNode* next = pcur->next;free(pcur);pcur = next;}//把哨兵位置为空...使用双链表可以方便地将最近访问的节点移到链表的前端,并在需要时从链表的后端移除节点。3.实现双向队列(Deque)双向队列是一种具有队列和栈的性质的数据结构,支持从两端插入和删除元素。...6.网络协议中的数据传输在某些网络协议中,数据需要在不同的节点之间传输,并且可能需要在传输过程中进行插入或删除操作。双链表可以方便地实现这样的数据传输机制。

    9310

    什么是链表?

    在了解完什么是数据结构之后,让我们一起来探索下数据结构中常见的一种—链表。 链表 链表是数据结构之一,其中的数据呈线性排列。在链表中,数据的添加和删除都较为方便,就是访问比较耗费时间。 ?...这时,只需要把 Green 指针指向的位置从 Yellow 变成 Red,删除就完成了。虽然 Yellow 本身还存储在内存中,但是不管从哪里都无法访问这个数据,所以也就没有特意去删除它的必要了。...另外,添加数据只需要更改两个指针的指向,所以耗费的时间与 n 无关。如果已经到达了添加数据的位置,那么添加操作只需花费 O(1)的时间,删除数据同样也只需 O(1)的时间。...使用这种链表,不仅可以从前往后,还可以从后往前遍历数据,十分方便。 但是,双向链表存在两个缺点:一是指针数的增加会导致存储空间需求增加;二是添加和删除数据时需要改变更多指针的指向。 ?...总结 看完之后,相信大家都对链表和链表的基本操作有了一定的了解,还对循环链表和双向链表有了初步的认识,大家可以使用自己喜欢的语言去设计实现下单向链表,有能力的话可以把循环链表和双向链表也实现下。

    67831

    图解数据结构之数组、链表、栈、队列

    链表不具有数组随机读取的优点,但是插入删除元素的时间复杂度为O(1) 2.2 链表分类 常见链表分类: 单链表 双向链表 循环链表 双向循环链表 假如链表中有n个元素。...2.2.3 双向链表 双向链表 包含两个指针,一个prev指向前一个节点,一个next指向后一个节点。 ?...栈常用一维数组或链表来实现,用数组实现的队列叫作 顺序栈 ,用链表实现的队列叫作 链式栈 。 假设堆栈中有n个元素。 访问:O(n)//最坏情况 插入删除:O(1)//顶端插入和删除元素 ?...访问:O(n)//最坏情况 插入删除:O(1)//后端插入前端删除元素 ? 4.2 队列分类 4.2.1 单队列 单队列就是常见的队列, 每次添加元素时,都是添加到队尾。...当进行入队、出队操作的时候,front和 rear 都会持续往后移动,当 rear 移动到最后的时候,我们无法再往队列中添加数据,即使数组中还有空余空间,这种现象就是 ”假溢出“ 。

    2.7K50

    【数据结构】线性表----链表详解

    双向和单向 单向链表:每个节点包含一个指向下一个节点的指针。单向链表只能从头节点开始遍历,无法从尾节点向前遍历。 双向链表:每个节点包含一个指向下一个节点和一个指向前一个节点的指针。...双向链表可以从头节点或尾节点开始遍历,可以方便地在链表中间插入或删除节点。...在双向链表中,通常有一个头节点和一个尾节点,它们分别指向链表的第一个节点和最后一个节点,可以方便地在头部或尾部进行插入或删除操作。...双向链表的作用以及使用场景 需要频繁在链表中间插入或删除节点的情况:双向链表可以在O(1)的时间复杂度内完成插入或删除操作,因此适合在需要频繁插入或删除节点的场景中使用。...需要实现栈或队列的情况:双向链表可以方便地在两端进行插入或删除操作,因此适合用来实现栈或队列。

    11510

    移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——7.list(无习题)

    1.1 双向链表简介 双向链表是一种链式存储结构,与单向链表相比,它多了一个指向前驱节点的指针。这样设计的优点是,可以从任意一个节点向前或向后遍历链表,操作更加灵活。...2. list 的特点与优缺点 2.1 list 的特点 双向链表结构:list 使用双向链表来存储数据,因此插入和删除操作的时间复杂度为 O(1)。...动态大小:list 的大小可以根据需要动态调整,插入和删除元素不会像 vector 那样引发频繁的内存重新分配。 双向迭代器:list 提供双向迭代器,可以在链表中向前或向后遍历,灵活度较高。...随机访问需求低:如果不需要频繁访问特定位置的元素,而只是顺序遍历或插入和删除,list 的链表结构可以很好地满足需求。...总结 C++ 中的 list 容器是一种基于双向链表的数据结构,适合需要频繁插入和删除元素的场景。list 提供了灵活的增删操作和双向迭代器,能够在常数时间内完成插入和删除操作。

    11410

    算法+数据结构(第05篇)走下神坛吧!算法

    链表就是单入口小火车 链表分为单向链表与双向链表。两者的区别: 单向链表从当前节点只能访问它的下一个节点,而双向链表可以从当前节点同时访问它的前一个节点和后一个节点。...因为没有前向挂钩,所以从3号车厢无法到达2号车厢;同理,从2号车厢也无法到达1号车厢。 从这里可以看出链表的一个最大弱点:随机访问元素有点烦! 再来看看双向链表的“小火车”: ?...:) 如果不提前“系住”,那么一旦2号车厢与3号车厢分离,我们就再也没有有效办法到达3号车厢了。 那么如何实现“系住”呢?用变量保存要“系住”的“车厢”(链表节点)位置。...看到这里,相信对于单向链表的节点添加操作你再也不会忘记了:) 双向链表的节点添加操作与上类似,无非就是多了一个前向挂钩的处理。 2.3 删除链表节点 假如现在要去掉3号车厢,那么怎么做呢?...双向链表的节点删除操作与上类似,无非就是多了一个前向挂钩的处理。 从这里可以看出链表的最大优点:增删元素相对于数组容易! END

    46640
    领券