STL--双端队列(deque)和链表(list)

双端队列(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,转载请注明源地址。

头文件  #include <deque>

定义变量  deque<int> mydeq;

主要成员函数

mydeq.clear()  移除容器中所有数据。

mydeq.push_front(elem)  在队列首部加入一个数据

mydeq.pop_front()  删除队列尾部数据

mydeq.push_back(elem)  在队列尾部加入一个数据

mydeq.pop_back()  删除队列尾部数据

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");
}

链表(list容器类):

#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举例:


#include <iostream>
#include <string>
#include <list>
using namespace std;
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();
}

STL--双端队列(deque)和链表(list),布布扣,bubuko.com

时间: 2024-10-07 09:51:09

STL--双端队列(deque)和链表(list)的相关文章

C++ STL 双端队列deque详解

一.解释 Deque(双端队列)是一种具有队列和栈的性质的数据结构.双端队列的元素可以从两端弹出,其限定插入和删除操作在表的两端进行. 二.常用操作: 1.头文件 #include <deque> 2.定义 a) deque<int>s1; b) deque<string>s2; c) deque<node>s3; /*node为结构体,可自行定义.*/ 3.常用操作 //a) 构造函数 deque<int> ideq //b)增加函数 ideq

nyoj1117 鸡蛋队列 (双端队列,deque)

题目1117 题目信息 运行结果 本题排行 讨论区 鸡蛋队列 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 将两根筷子平行的放在一起,就构成了一个队列.将带有编号的鸡蛋放到两根筷子之间叫做入队(push),将筷子之间的鸡蛋拿出来叫做出队(pop).但这两种方式有特殊的定义,对于入队,只能将鸡蛋从队列的尾部向里放入:对于出队,只能将鸡蛋从队列的头部向外将鸡蛋拿出来. 将①.②入队: 头____________尾                         ___

双端队列deque的应用

collections模块作为基础数据类型的一种扩展,提供了更为丰富的数据结构支持.和list相比,双端队列deque在数组的首部和尾部进行增加和删除元素的时间复杂度都为O(1).而list在数组尾部进行操作的时间复杂度为O(1),在首部进行增加删除数据的时间复杂度为O(n)(涉及到整个数组元素的移动). Deques支持线程安全,内存有效的在队列两端进行删除增加元素操作,在任一方向上具有大致相同的O(1)性能. 类原型:collections.deque([iterable[, maxlen]

关于双端队列 deque 模板 &amp;&amp; 滑动窗口 (自出)

嗯... deque 即为双端队列,是c++语言中STL库中提供的一个东西,其功能比队列更强大,可以从队列的头与尾进行操作... 但是它的操作与队列十分相似,详见代码1: 1 #include <cstdio> 2 #include <iostream> 3 #include <deque> 4 //实际上,引用queue头文件也可以,里面包含了deque头文件 5 6 using namespace std; 7 8 deque<int> dq; //定义

URAL 2026 Dean and Schedule 贪心、双端队列(deque)、队列(queue)

C - Dean and Schedule Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice URAL 2026 Description A new academic year approaches, and the dean must make a schedule of classes for first-year students. Ther

Java队列Queue、双端队列Deque

http://uule.iteye.com/blog/2095650?utm_source=tuicool 注意:这都只是接口而已 1.Queue API 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口. Java代码   public interface Queue<E> extends Collection<E> 除了基本的 Collection 操作外,队列还提供其他的插入.提取和检查

双端队列 ADT接口 链表实现

Deque ADT接口 DEQUEUE.h: 1 #include <stdlib.h> 2 #include "Item.h" 3 4 typedef struct DEQUEUEnode *link; 5 struct DEQUEUEnode 6 { 7 Item item; 8 link next; 9 link last; 10 }; 11 12 void DEQUEUEinit(int); 13 void DEQUEUEerror(void); 14 Item D

【deque】滑动窗口、双端队列解决数组问题

C++手册之deque 所属头文件 <deque> 常用操作: back()返回尾部元素: front()返回头部元素: push_back()尾部插入元素: pop_bakc()尾部删除元素: push_front()头部插入元素: pop_front()头部删除元素: 问题1:求滑动窗口的最大值(<剑指offer面试题65>) 描述:给定一个数组和滑动窗口的大小,找出所有滑动窗口里的最大值. 示例:数组{2, 3, 4, 2, 6, 2, 5} 窗口大小为 3,一共有7-3+1

【Weiss】【第03章】练习3.26:双端队列

[练习3.26] 双端队列(deque)是由一些项的表组成的数据结构,对该数据结构可以进行下列操作: Push(X,D):将项X插入到双端队列D的前端. Pop(D):从双端队列D中删除前端项并返回. Inject(X,D):将项X插入到双端队列D的尾端. Eject(D):从双端队列D中删除尾端项并返回. 编写支持双端队列的例程,每种操作均花费O(1)时间. Answer: 相当简单的题目,把改一改双向链表就可以了. 测试代码: 1 #include <iostream> 2 #includ

算法导论之八(10.1-5单数组实现双端队列)

算法导论第三版P131 题目: 10.1-5 栈插入和删除元素只能在同一端进行,队列的插入操作和删除操作分别在两端进行,与它们不同的,有一种双端队列(deque),其插入和删除操作都可以在两端进行.写出4个时间均为O(1)的过程,分别实现在双端队列插入和删除元素的操作,该队列使用一个数组实现的. 注意点: 1.左右端点指向的位置是类似于队列中的tail端点,是下一个插入操作的位置. 2.然后注意遍历的时候,左端点和右端点的位置关系,有两种可能,所以遍历的方式不一样. 代码: /* * 使用单数组