STL学习(4):deque双端容器

    xiaoxiao2022-06-25  203

    STL学习网址:

    C语言中文网:http://c.biancheng.net/stl/

    deque容器为一个给定类型的元素进行线性处理,就如向量,它能够快速地随机进入任一个元素,并且能够高效地插入和删除容器的尾部元素。但它与vector不同,deque能支持高效插入和删除容器的头部元素,也叫做双端队列。

    常用函数

    push_back 从尾部插入元素push_front 从头部插入元素pop_back 从尾部删除元素pop_front 从头部删除元素 //构造函数 deque() //创建一个空deque deque(int nSize) //创建一个deque, 元素个数为nSize deque(int nSize, const T& t) //创建一个deque,元素个数为nSize, 且值均为t deque (const deque &) //拷贝构造函数 //增加函数 void push_front(const T& x) // 双端队列头部增加一个元素x void push_back(const T& x) // 双端队列尾部增加一个元素x iterator insert(iterator it, const T& x) // 双端队列中某一元素前增加一个元素x void insert(iterator it, int n, const T& x) // 双端队列中某一元素前增加n个相同元素x void insert(iterator it,const_iterator first, const_iterator last)// // 双端队列中某一元素前插入另一个相同类型向量的[first,last)间的数据 //删除函数 iterator erase(iterator it) //删除双端队列中某一个元素 iterator erase(iterator first, iterator last) //删除双端队列中[first,last)中元素 void pop_front() //删除双端队列中最后一个元素 void pop_back() //删除双端队列中最后一个元素 void clear() //删除双端队列中所有元素 //遍历函数 reference at(int pos) //返回pos位置元素的引用 reference front() //返回首元素的引用 reference back() //返回尾元素的引用 iterator begin() //返回向量头指针,指向第一个元素 iterator end() //返回向量尾指针,不包括最后一个元素,在其下面 reverse_iterator rbegin()//反向迭代器,功能等同iterator end() reverse_iterator rend() //反向迭代器,功能等同iterator begin() //判断函数 bool empty() const //向量是否为空?若true,则向量中无元素。 //大小函数 int size() const //返回向量中元素的个数 int max_size() const //返回最大可允许的双端队列元素数量值 //其它函数 void swap(vector&) //交换两个同类型向量的数据 void assign(int n, const T& x) //向量中第n个元素设置成元素x void assign(const_iterator first, const_iterator last)//向量中[first,last]元素设置成当前向量元素

    知识点:

    distance函数可以求出当前的迭代器指针it距离头部的位置,也就是容器的指针

    用法: distance(v1.begin(), it)

    //定义deque对象 deque<int> d1; //尾部插入元素 d1.push_back(10); d1.push_back(20); d1.push_back(30); //头部插入元素 d1.push_front(1); d1.push_front(2); d1.push_front(3); //尾部删除元素 d1.pop_back(); //头部删除元素 d1.pop_front(); //修改头部和尾部的值 d1.front() = 111; d1.back() = 222; //查找元素为1的下标 //通过distance求取下标 deque<int>::iterator it = d1.begin(); while (it != d1.end()) { if (*it == 1) { cout << "下标:" << distance(d1.begin(), it) << endl; } it++; } //遍历 for (deque<int>::iterator it = d1.begin(); it != d1.end(); it++) { cout << *it << " "; } cout << endl;

    deque中push_front、pop_front函数示例

    deque可以通过push_front直接在容器头增加元素,通过pop_front直接删除容器头元素,这一点是vector元素不具备的。

    #include <iostream> #include <deque> using namespace std; void main() { deque<int> d; d.push_back(10); d.push_back(20); d.push_back(30); cout << "原始双端队列:" ; for(int i=0; i<d.size(); i++) { cout << d.at(i) << "\t"; //10 20 30 } cout << endl; d.push_front(5); d.push_front(3); d.push_front(1); cout << "push_front(5,3,1)后:"; for(i=0; i<d.size(); i++) { cout << d.at(i) << "\t"; //1 3 5 10 20 30 } cout << endl; d.pop_front(); d.pop_front(); cout << "两次pop_front后:"; for(i=0; i<d.size(); i++) { cout << d.at(i) << "\t"; //5 10 20 30 } cout << endl; }

    以deque为基础,编一个先进先出的队列类。

    分析:通常编制队列的方法是:定义数据结构,对具体的函数要一步步完成具体的代码。但是,仔细分析一下,队列操作仅是对队头完成删除操作,对尾完成插入操作,它所需要的功能完全在deque容器提供功能的范围之内。那么很自然想到从deque中提取需要的函数,这样具体的代码就不用重新编制了。

    #include <iostream> #include <deque> using namespace std; template <class T> class MyQueue { deque<T> d; public: void push(const T& t) //添加队尾元素 { d.push_back(t); } void pop() //删除队头元素 { d.pop_front(); } int size() //获得队列大小 { return d.size(); } bool empty() //队列空否 { return d.empty(); } T& front() //获得队头元素 { return *d.begin(); } T& back() //获得对尾元素 { return *(--d.end()); } void display() { for(int i=0; i<d.size(); i++) { cout << d.at(i) << "\t"; } } }; void main() //测试函数 { MyQueue<int> myqueue; for(int i=1; i<=5; i++)//初始化队列:1 2 3 4 5 { myqueue.push(i); } cout << "原队列:"; myqueue.display(); cout << endl;//原队列显示:1 2 3 4 5 myqueue.pop(); //删除队头元素 1 cout << "删除队头元素后:"; myqueue.display(); cout << endl; myqueue.push(6); //插入队尾元素6 cout << "插入队尾元素6后:"; myqueue.display(); cout << endl; cout <<"当前队头元素:"; cout << myqueue.front() << endl;//获得队头元素 cout <<"当前队尾元素:"; cout << myqueue.back() << endl; //获得队尾元素 }

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     


    最新回复(0)