STL--双端队列(deque)和链表(list)
2023-09-14 08:57:59 时间
双端队列(deque容器类):
#include deque 与vector 类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。
与vector不同的是:deque 还支持从开始端插入数据:push_front() 。
此外deque 不支持与vector 的capacity() 、reserve() 类似的操作。
deque,是“double-ended queue”的缩写。可以随机存取元素(用索引直接存取)。
数组头部和尾部添加或移除元素都非常快速,但是在中部安插元素比较费时。
本文地址:http://www.cnblogs.com/archimedes/p/cpp-deque-list.html,转载请注明源地址。
mydeq.empty() 判断队列是否为空,为空返回true mydeq.size() 返回容器中实际数据的个数。 mydeq.erase(pos) 删除pos位置的数据,返回下一个数据的位置。 mydeq.insert(pos,cnt,elem) 在pos位置插入cnt个数据elem。 mydeq.begin() 返回的指针指向数组中的第一个数据。 mydeq.end() 实际上是取末尾加一,以便让循环正确运行--它返回的指针指向最靠近数组界限的数据。 operator[] 返回容器中指定位置的一个引用 deque举例:
#include list ,是一种双线性列表,只能顺序访问(从前向后或者从后向前)。 list 的数据组织形式 与前面两种容器类有一个明显的区别就是:它不支持随机访问。要访问表中某个下标处的项需要从表头或表尾处(接近该下标的一端)开始循环。而且缺少下标运算符: operator[] 。 在任何位置上执行插入或删除动作都非常迅速,内部只需调整一下指针。 list 内部实现: 双向链表 list T, Alloc 支持操作: begin(), end(), size(), clear(), empty() push_back(), pop_back() push_front(), pop_front() insert() O(1) erase() O(1) sort() O(nlogn),不同于 algorithm 中的sort list仍然包含了erase(),begin(),end(),insert(),push_back(),push_front()这些基本函数,下面我们来演示一下list的其他函数功能。 merge():合并两个排序列表; sort():列表的排序; list举例:
void PrintIt(list int n) { for (list int ::iterator iter = n.begin(); iter != n.end(); ++iter) cout *iter " ";//用迭代器进行输出循环 int main(void) { list int listn1, listn2; //给listn1,listn2初始化 listn1.push_back(123); listn1.push_back(0); listn1.push_back(34); listn1.push_back(1123); //now listn1:123,0,34,1123 listn2.push_back(100); listn2.push_back(12); //now listn2:12,100 listn1.sort(); listn2.sort(); //给listn1和listn2排序 //now listn1: 0,34,123,1123 listn2: 12,100 PrintIt(listn1); cout endl; PrintIt(listn2); listn1.merge(listn2); //合并两个排序列表后,listn1: 0,12,34,100,123,1123 cout endl; PrintIt(listn1); cin.get(); }
Redis(八)-Redis的list列表的数据结构-快速链表 数组时需要一块连续的内存空间来存储的,而链表值需要零散的内存碎片,数组的插入和删除的时间复杂度是0(n),查询的某个元素的时间复杂度是O(1)。
LeetCode 138:复制带随机指针的链表 Copy List with Random Pointer 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。 要求返回这个链表的深拷贝。 A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
mydeq.empty() 判断队列是否为空,为空返回true mydeq.size() 返回容器中实际数据的个数。 mydeq.erase(pos) 删除pos位置的数据,返回下一个数据的位置。 mydeq.insert(pos,cnt,elem) 在pos位置插入cnt个数据elem。 mydeq.begin() 返回的指针指向数组中的第一个数据。 mydeq.end() 实际上是取末尾加一,以便让循环正确运行--它返回的指针指向最靠近数组界限的数据。 operator[] 返回容器中指定位置的一个引用 deque举例:
#include iostream #include deque using namespace std; typedef deque int INTDEQUE; // 从前向后显示deque 队列的全部元素 void put_deque(INTDEQUE deque, char *name) INTDEQUE::iterator pdeque;// 仍然使用迭代器输出 cout "The contents of " name " : "; for(pdeque = deque.begin(); pdeque != deque.end(); pdeque++) cout *pdeque " ";// 注意有 "*" 号哦,没有"*" 号的话会报错 cout endl; // 测试deqtor 容器的功能 int main() //deq1 对象初始为空 INTDEQUE deq1; //deq2 对象最初有10 个值为6 的元素 INTDEQUE deq2(10,6); // 声明一个名为i 的双向迭代器变量 INTDEQUE::iterator i; // 从前向后显示deq1 中的数据 put_deque(deq1,"deq1"); // 从前向后显示deq2 中的数据 put_deque(deq2,"deq2"); // 从deq1 序列后面添加两个元素 deq1.push_back(2); deq1.push_back(4); cout "deq1.push_back(2) and deq1.push_back(4):" endl; put_deque(deq1,"deq1"); // 从deq1 序列前面添加两个元素 deq1.push_front(5); deq1.push_front(7); cout "deq1.push_front(5) and deq1.push_front(7):" endl; put_deque(deq1,"deq1"); // 在deq1 序列中间插入数据 deq1.insert(deq1.begin()+1,3,9); cout "deq1.insert(deq1.begin()+1,3,9):" endl; put_deque(deq1,"deq1"); // 测试引用类函数 cout "deq1.at(4)=" deq1.at(4) endl; cout "deq1[4]=" deq1[4] endl; deq1.at(1)=10; deq1[2]=12; cout "deq1.at(1)=10 and deq1[2]=12 :" endl; put_deque(deq1,"deq1"); // 从deq1 序列的前后各移去一个元素 deq1.pop_front(); deq1.pop_back(); cout "deq1.pop_front() and deq1.pop_back():" endl; put_deque(deq1,"deq1"); // 清除deq1 中的第2 个元素 deq1.erase(deq1.begin()+1); cout "deq1.erase(deq1.begin()+1):" endl; put_deque(deq1,"deq1"); // 对deq2 赋值并显示 deq2.assign(8,1); cout "deq2.assign(8,1):" endl; put_deque(deq2,"deq2"); }
#include list ,是一种双线性列表,只能顺序访问(从前向后或者从后向前)。 list 的数据组织形式 与前面两种容器类有一个明显的区别就是:它不支持随机访问。要访问表中某个下标处的项需要从表头或表尾处(接近该下标的一端)开始循环。而且缺少下标运算符: operator[] 。 在任何位置上执行插入或删除动作都非常迅速,内部只需调整一下指针。 list 内部实现: 双向链表 list T, Alloc 支持操作: begin(), end(), size(), clear(), empty() push_back(), pop_back() push_front(), pop_front() insert() O(1) erase() O(1) sort() O(nlogn),不同于 algorithm 中的sort list仍然包含了erase(),begin(),end(),insert(),push_back(),push_front()这些基本函数,下面我们来演示一下list的其他函数功能。 merge():合并两个排序列表; sort():列表的排序; list举例:
void PrintIt(list int n) { for (list int ::iterator iter = n.begin(); iter != n.end(); ++iter) cout *iter " ";//用迭代器进行输出循环 int main(void) { list int listn1, listn2; //给listn1,listn2初始化 listn1.push_back(123); listn1.push_back(0); listn1.push_back(34); listn1.push_back(1123); //now listn1:123,0,34,1123 listn2.push_back(100); listn2.push_back(12); //now listn2:12,100 listn1.sort(); listn2.sort(); //给listn1和listn2排序 //now listn1: 0,34,123,1123 listn2: 12,100 PrintIt(listn1); cout endl; PrintIt(listn2); listn1.merge(listn2); //合并两个排序列表后,listn1: 0,12,34,100,123,1123 cout endl; PrintIt(listn1); cin.get(); }
Redis(八)-Redis的list列表的数据结构-快速链表 数组时需要一块连续的内存空间来存储的,而链表值需要零散的内存碎片,数组的插入和删除的时间复杂度是0(n),查询的某个元素的时间复杂度是O(1)。
LeetCode 138:复制带随机指针的链表 Copy List with Random Pointer 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。 要求返回这个链表的深拷贝。 A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
相关文章
- 141. 环形链表
- java list去重_JAVA基础-List去重的6种方式[通俗易懂]
- 数据结构之数组和链表的区别
- C语言 list 链表
- 【RTOS训练营】课程学习方法和结构体知识复习 + 链表知识
- LeetCode142. 环形链表 II(C++俩种解法)
- 图解剑指 Offer II 024. 反转链表(LeetCode)
- 找链表中间元素
- 后序遍历线索化二叉树_二叉树的中序线索链表
- 147. 对链表进行插入排序
- C语言链表详解_c语言中链表的使用
- 双向链表[js实现] 【7】
- 【数据结构初阶】双向带头循环链表原来是纸老虎,结构复杂,操作简单
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-456 求链表各节点的平均值(C++解法)
- 高频算法题-回文链表
- 数据结构006:环形链表
- 【Android 异步操作】手写 Handler ( 消息队列 MessageQueue | 消息保存到链表 | 从链表中获取消息 )
- 【Linux 内核 内存管理】RCU 机制 ③ ( RCU 模式下添加链表项 list_add_rcu 函数 | RCU 模式下删除链表项 list_del_rcu 函数 )
- 【Linux 内核 内存管理】RCU 机制 ④ ( RCU 模式下更新链表项 list_replace_rcu 函数 | 链表操作时使用 smp_wmb() 函数保证代码执行顺序 )
- Redis实现List分页技术研究(redis的list分页)
- 创建list ALV tree[RS_TREE_LIST_DISPLAY]详解编程语言
- 长度查看Redis List长度:简单有效(redis查看list)
- Redis如何清空List:技巧分享(redis清空list)
- 类型探索Redis中List数据结构的优势(redis中的list)
- 构建双向链表:在Linux环境下的实现(双向链表linux)
- MySQL链表查询技巧分享(mysql链表查询)
- 利用Redis List对象提升系统性能(redis list对象)
- 深入浅出Redis的List数据结构遍历(遍历redis list)
- 以List的形式将数据插入Redis(把list插入redis)
- MySQL三级链表查询详解(mysql 三级链表查询)
- Yii2实现Redis链表,不再是难题(yii2 redis链表)
- 使用Redis实现List存储(向redis中存list)
- Redis中List与Set的应用(redis集合与list)
- 实现使用List实现Redis队列(redis队列用list)
- Redis链表长度紧凑性与可扩展性的平衡(redis 链表长度)
- 警惕Redis List被空出(redis里list为空)
- java数据结构之实现双向链表的示例