• STL的Deque介绍


    Deque是双端队列,在画动态图表的时候使用起来比较方便。因为当数据填满图表后,需要从队列的后方插入一个元素,然后再从队列的前方删除一个元素。使用Deque可以很方便的做到。使用push(pop)-back(front)就ok了

    下面摘录了一个Deque的使用教程

    /*deque: 是一个double-ended queue,
        1)支持随即存取,也就是[]操作符,
        2)支持两端操作,push(pop)-back(front),在两端操作上与list效率差不多
    
        因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则: 
        1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector 
        2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list 
        3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。
    */
    
    #include <iostream>
    #include <deque>
    using namespace std;
    
    void printDeque(deque<int> d)
    {
    //使用下标
    //for (unsigned int i = 0; i < d.size(); i++)
    //{
    // cout<<"d["<<i<<"] = "<<d[i]<<", ";
    //}
    
    //使用迭代器
    //deque<int>::iterator iter = d.begin();
    //for (;iter != d.end(); iter ++)
    //{
    // cout<<"d["<<iter-d.begin()<<"] = "<<(*iter)<<", ";
    //}
    
    //使用迭代器指针
    deque<int>::iterator *pIter = new deque<int>::iterator;
    if ( NULL == pIter )
    {
       return ;
    }
    for (*pIter = d.begin(); *pIter != d.end(); (*pIter)++)
    {
       cout<<"d["<<*pIter - d.begin() <<"]="<<**pIter<<", ";
    }
    if (NULL != pIter)
    {
       delete pIter;
       pIter = NULL;
    }
    
    cout<<endl;
    }
    
    void main()
    {
    //创建deque
    deque<int> d1; //创建一个没有任何元素的deque对象
    deque<int> d2(10);//创建一个具有10个元素的deque对象,每个元素值为默认
    deque<double> d3(10, 5.5); //伊妹一个具有10个元素的deque对象,每个元素的初始值为5.5
    deque<double> d4(d3); //通过拷贝一个deque对象的元素值, 创建一个新的deque对象
    int iArray[] = {11, 13, 19, 23, 27};
    deque<int> d5(iArray, iArray+5);//将迭代器区间[first, last)所指的元素拷贝到一个新创建的deque对象中
    
    //初始化赋值:同vector一样,使用尾部插入函数push_back()
    for (int i = 1; i < 6 ; i++)
       d1.push_back(i*10);
    //遍历元素: 1-下标方式 2-迭代器方式 反向遍历(略)
    cout<<"printDeque(d1) : "<<endl;
    printDeque(d1);
    
    //元素插入:尾部插入用push_back(),头部插入用push_front(),其它位置插入用insert(&pos, elem)
    cout<<"d1.push_front(100): "<<endl;
    d1.push_front(100);
    printDeque(d1);
    cout<<"d1.insert(d1.begin()+3, 200): "<<endl; //支持随机存取(即[]操作符),所以begin()可以+3
    d1.insert(d1.begin()+2,200);
    printDeque(d1);
    
    //元素删除 尾部删除用pop_back();头部删除用pop_front(); 
    //任意迭代位置或迭代区间上的元素删除用erase(&pos)/erase(&first, &last);删除所有元素用clear();
    cout<<"d1.pop_front(): "<<endl;
    d1.pop_front();
    printDeque(d1);
    
    cout<<"d1.erase(d1.begin()+1): "<<endl;
    d1.erase(d1.begin()+1); //删除第2个元素d1[1]
    printDeque(d1);
    
    cout<<"d1.erase(d1.begin(), d1.begin() + 2) = "<<endl;
    d1.erase(d1.begin(), d1.begin() + 2);
    printDeque(d1);
    
    cout<<"d1.clear() :"<<endl;
    d1.clear();
    printDeque(d1);
    
    
    //其它常用
    cout<<"其它常用用法: "<<endl;
    int flag = 0;
    while(flag < 2)
    {
       if (0 == flag )
       {
        for (int i = 1; i < 6 ; i++) //恢复
         d1.push_back(i*10);
       }
       else
       {
        d1.clear();
        cout<<"after d1.clear() , d1.front(), d1.back() is abnormal! other info.:"<<endl;
       }
       cout<<"d1.empty() = "<<d1.empty()<<endl;
       cout<<"d1.size() = "<<d1.size()<<endl;
       cout<<"d1.max_size() = "<<hex<<d1.max_size()<<endl;
       if (!d1.empty())
       {
        cout<<"d1.front() = "<<d1.front()<<endl;
        cout<<"d1.back() = "<<d1.back()<<endl;
       }
      
       flag++;
      
    }
    
    //交换
    cout<<"d1.swap(d5)= "<<endl;
    d1.swap(d5);
    cout<<"d1 = ";
    printDeque(d1);
    cout<<"d5 = ";
    printDeque(d5);
    //printDeque(d)
    
    
    }
    

  • 相关阅读:
    Java:求字符串中邻接的数字为一个整体
    在jsp提交表单的参数封装到一个方法里
    synchronized
    java内存模型JMM
    多线程学习:线程基础
    集合框架总结与开发遇到的问题
    HashSet、LinkedHashSet学习笔记
    Iterable、Collection、AbstractConlltion、List学习笔记
    LinkedList学习笔记
    LinkedHashMap
  • 原文地址:https://www.cnblogs.com/leixiaohua1020/p/3902171.html
Copyright © 2020-2023  润新知