stl-deque

deque(双端队列)

    需要包括头文件<deque>;

    定义:

         deque<数据类型> 变量名;

    Eg:

        deque<int> que;//定义了一个整型的双端队列;

   基本操作(红色标识为常用操作):

       que.assign(beg,end) 将[beg; end)区间中的数据赋值给que。

       que.assign(n,elem) 将n个elem的拷贝赋值给que。

       que. at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range。

       que.back() 返回容器que的最后一个元素的引用。如果que为空,则该操作未定义。

       que.begin() 传回迭代器中的第一个数据地址。

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

       que.empty() 判断容器是否为空。

       que.end() 返回一个迭代器,它指向容器que的最后一个元素的下一位置。

       que.erase(pos) 删除pos位置的数据,传回下一个数据的位置。

       que.erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置。

       que.front() 返回容器que的第一个元素的引用。如果que为空,则该操作为空。

       que.insert(pos,elem) 在pos位置插入一个elem拷贝,传回新数据位置

       que.insert(pos,n,elem) 在pos(迭代器)位置插入>n个elem数据。无返回值

 

       que.insert(pos,beg,end) 在pos位置插入在[beg,end)区间的数据。无返回值

       que.max_size() 返回容器que可容纳的最多元素个数。

       que.pop_back() 删除最后一个数据。

       que.pop_front() 删除头部数据。

       que.push_back(elem) 在尾部加入一个数据。

       que.push_front(elem) 在头部插入一个数据。

       que.rbegin() 返回一个逆序迭代器,它指向容器que的最后一个元素。

       que.rend() 返回一个逆序迭代器,它指向容器que的第一个元素的前一个位置。

       que.resize(num) 重新指定队列的长度。

       que.size() 返回容器中实际数据的个数。

       que.swap(que2) 交换容器que和que2中的所有元素。

       swap(que1,que2) 交换容器que1和que2中的所有元素。

     代码解释:

 


#include <deque>
#include <iostream>
using namespace std;
int main()
{
    deque<int> dInt;
    dInt.push_back(1);
    dInt.push_back(3);
    dInt.push_back(5);
    dInt.push_back(7);

    for (int i=0; i<dInt.size(); i++)
    {
        // 打印 d[0], d[1], d[2], d[3]。访问越界时,不产生异常
        cout << "d[" << i << "]=" << dInt[i] << endl;

        // 输出 dInt 中各个元素。当访问越界时,会抛出异常
        // cout << dInt.at(i) << endl;
    }

    return 0;
}


-------------------------------------------------------- 用迭代器访问 deque 元素
#pragma warning(disable:4786)  // 必须放在首行,忽略长字符的截断警告
#include <deque>
#include <iostream>
#include <string>
using namespace std;
int main()
{
    deque<string> dStr;
    dStr.push_back("北京");
    dStr.push_back("2008");
    dStr.push_back("奥运");

    // 迭代器 i 和 iend
    deque<string>::iterator i, iend;
    iend = dStr.end();
    int j;
    // 打印 “北京2008奥运”
    for (i=dStr.begin(), j=0; i!=iend; ++i, ++j)
        cout << *i;
    cout << endl;

    return 0;
}


/*        解释:
    由于 deque 使用了两个迭代器分别指向双端队列的首尾,因此,deque 具有高效的【头部】插入元素的函数 push_front()
其他位置的插入,将涉及相关元素的移位拷贝。
*/

-------------------------------------------------------- 头部和中间位置插入 deque 元素
#include <deque>
#include <iostream>
using namespace std;
int main()
{
    deque<int> dInt;
    dInt.push_back(6);
    dInt.push_back(7);

    // 头部插入
    dInt.push_front(5);
    for (int i=0; i<dInt.size(); i++)
        cout << dInt[i] << ' ';
    cout << endl;

    // 中间位置插入
    // 在第2个元素之前插入9, 即 5 9 6 7 
    dInt.insert(dInt.begin() + 1, 9);
    for (int j=0; j<dInt.size(); j++)
        cout << dInt[j] << ' ';
    cout << endl;

    return 0;
}


/*        解释:
    deque 容器提供了删除首元素的 pop_front 函数,删除尾元素的 pop_back 函数,删除任意位置或迭代器区间上元素的 erase 函数,以及删除所有元素的 clear 函数。
1.    void pop_front();     删除 deque 的第一个元素
2.    void pop_back();    删除 deque 的最后一个元素
3.    iterator erase(iterator pos);     删除 pos 所指向的元素
4.    iterator erase(iterator first, iterator last);    删除 迭代器区间 [first, last) 所指向的所有元素。
5.    void clear();    删除所有元素
*/

-------------------------------------------------------- 头尾和其他位置删除 deque 元素
#include <deque>
#include <iostream>
using namespace std;
int main()
{
    deque<int> dInt;
    dInt.push_back(4);
    dInt.push_back(5);
    dInt.push_back(3);
    dInt.push_back(3);
    dInt.push_back(3);
    dInt.push_back(6);
    for (int i=0; i<dInt.size(); i++)
        cout << dInt[i] << ' ';
    cout << endl;

    // 头尾和任意删除元素
    dInt.erase(dInt.begin() + 1);  // 删除第 2 个元素 dInt[1]
    dInt.pop_front();    // 删除首元素
    dInt.pop_back();    // 删除末尾元素
    for (int j=0; j<dInt.size(); j++)
        cout << dInt[j] << ' ';
    cout << endl;
    // 删除所有元素
    dInt.clear();
    cout << "执行 clear() " << endl << "deque 元素全部清除" << endl;

    return 0;
}


-------------------------------------------------------- deque 元素的反向遍历
#include <deque>
#include <iostream>
using namespace std;
int main()
{
    deque<int> dInt;
    dInt.push_back(1);
    dInt.push_back(3);
    dInt.push_back(5);
    dInt.push_back(7);
    dInt.push_back(9);
    dInt.push_back(11);
    // deque元素的前向遍历
    deque<int>::iterator i,iend;
    iend = dInt.end();
    for (i=dInt.begin(); i!=iend; ++i)
        cout << *i << ' ';

    cout << endl;
    // deque元素的反向遍历
    deque<int>::reverse_iterator ri, riend;
    riend = dInt.rend();
    for (ri=dInt.rbegin(); ri!=riend; ++ri)
        cout << *ri << ' ';
    cout << endl;

   return 0;
}


-------------------------------------------------------- 两个 deque 容器的元素交换
#include <deque>
#include <iostream>
using namespace std;

void print(deque<int>& d);

int main()
{
   // d1
    deque<int> d1;
    d1.push_back(11);
    d1.push_back(12);
    d1.push_back(13);
    cout << "d1 = ";
    print(d1);
    
    // d2
    deque<int> d2;
    d2.push_back(90);
    d2.push_back(91);
    d2.push_back(92);
    cout << "d2 = ";
    print(d2);

    // d1 和 d2 交换
    d1.swap(d2);
    cout << "d1 和 d2 交换后" << endl;
    cout << "d1 = ";
    print(d1);
    cout << "d2 = ";
    print(d2);

    return 0;
}

// deque 元素打印
void print(deque<int>& d)
{
    
    for (int i=0; i<d.size(); i++)
        cout << d[i] << ' ';
    cout << endl;
}


/*        解释:
    deque 其他函数的说明,参加 Random access container 、 Back insertion sequence 和 Front insertion sequence 概念的函数定义要求,下面给出 deque 的其他几个常用函数的用法。
bool  empty()    判断 deque 容器是否已有元素,是则返回 true,否则返回 false
size_type  size()    当前 deque 容器的元素个数
size_type  max_size()    系统所支持的 deque 容器的最大元素个数
reference  front()    deque容器的首元素(引用返回),要求 deque 不为空
reference  back()    deque容器的末元素(引用返回),要求 deque 不为空
*/
-------------------------------------------------------- deque 其他常用函数的使用
#pragma warning(disable:4786)
#include <deque>
#include <iostream>
#include <string>
using namespace std;
int main()
{
    deque<string> dStr;
    // 打印 deque 为空
    cout << "dStr是否为空: " << dStr.empty() << endl;
    // 装入deque 元素
    dStr.push_back("红楼梦");
    dStr.push_back("三国演义");
    dStr.push_back("西游记");
    dStr.push_back("水浒传");
    dStr.push_back("史记");
    dStr.push_back("莫言");
    dStr.push_back("金庸");
    dStr.push_back("何亮到此一游");
    // 打印 deque 所有元素
    deque<string>::iterator i, iend;
    iend = dStr.end();
    for (i=dStr.begin(); i!=iend; ++i)
        cout << *i << "    ";
    cout << endl;
    // 打印首元素
    cout << "deque 首元素为: " << dStr.front() << endl;
    // 打印末元素
    cout << "deque 末元素为: " << dStr.back() << endl;
    // 打印元素个数
    cout << "deque 元素个数为: " << dStr.size() << endl;
    // 打印可支持的最大 deque 元素个数
    cout << "deque 最大元素个数为: " << dStr.max_size() << endl;

    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值