zoukankan      html  css  js  c++  java
  • 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"); 
    }
    View Code

     链表(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();
    }
  • 相关阅读:
    [LeetCode]Sort List
    [LeetCode]Single Number II
    合并两个排序的列表
    翻转链表
    链表中倒数第k个结点
    调整数组顺序使奇数位于偶数前面
    数值的整数次方
    二进制中1的个数
    矩形覆盖
    变态跳台阶
  • 原文地址:https://www.cnblogs.com/wuyudong/p/cpp-deque-list.html
Copyright © 2011-2022 走看看