《程序设计实习》之【STL-list和deque】

7 篇文章 0 订阅

list容器

  • 双向链表#include<list>

  • 在任何位置插入/删除都是常数时间

  • 不支持根据下标随机存取元素
  • 具有所有书序容器都有的成员函数
  • 还支持8个成员函数
成员函数作用
push_front在链表最前面插入
pop_font删除链表最前面的元素
sort排序(list不支持STL的算法sort
remove删除和指定值相等的所有元素
unique删除所有和前一个元素相同的元素
merge合并两个链表,并清空被合并的链表
reverse颠倒链表
splice在指定位置前面插入另一链表中的一个或多个元素,并在另一链表中删除被插入的元素
  • list容器的迭代器不支持完全随机访问 -> 不能用标准库中sort函数对它进行排序
  • list自己的sort成员函数
list<T> classname;
classname.sort(compare);   // compare函数可以自己定义
classname.sort();       // 无参数版本, 按<排序
  • list容器只能使用双向迭代器 -> 不支持><比较运算符、[]运算符和随机移动

例:

#include <iostream>
#include <list>
#include <vector>
#include <algorithm>
using namespace std;

class A {   // 定义类A,并以友元重载<,==和<<
private:
    int n;
public:
    A(int n_) { n = n_; }
    friend bool operator < (const A& a1, const A& a2);
    friend bool operator == (const A &a1, const A& a2);
    friend ostream & operator << ( ostream &o, const A& a);
};
bool operator < (const A& a1, const A& a2) {
    return a1.n < a2.n;
}
bool operator == (const A& a1, const A& a2) {
    return a1.n == a2.n;
}
ostream & operator << ( ostream &o, const A& a) {
    o << a.n;
    return o;
}
// 定义函数模板PrintList,打印列表中的对象
template <class T>
void PrintList(const list<T> &lst) {
    int tmp = lst.size();
    if (tmp > 0) {
        typename list<T>::const_iterator i;   // typename用来说明 list<T>::const_iterator 是个类型,在VS中不写也可以,xcode中不写会报错
        for (i = lst.begin(); i != lst.end(); i++) {
            cout << *i << ", ";
        }
    }
}
int main() {
    list<A> lst1, lst2;
    lst1.push_back(1); lst1.push_back(3);
    lst1.push_back(2); lst1.push_back(4); lst1.push_back(2);
    lst2.push_back(10); lst2.push_front(20);
    lst2.push_back(30); lst2.push_back(30);
    lst2.push_back(30); lst2.push_front(40); lst2.push_back(40);
    cout << "1) "; PrintList(lst1); cout << endl;    // 1) 1, 3, 2, 4, 2,
    cout << "2) "; PrintList(lst2); cout << endl;    // 2) 40, 20, 10, 30, 30, 30, 40,
    lst2.sort();   // list容器的sort函数
    cout << "3) "; PrintList(lst2); cout << endl;    // 3) 10, 20, 30, 30, 30, 40, 40,
    lst2.pop_front();
    cout << "4) "; PrintList(lst2); cout << endl;    // 4) 20, 30, 30, 30, 40, 40,
    lst1.remove(2);   // 删除所有和A(2)相等的元素
    cout << "5) "; PrintList(lst1); cout << endl;    // 5) 1, 3, 4,
    lst2.unique();    // 删除所有和前一个元素相等的元素
    cout << "6) "; PrintList(lst2); cout << endl;    // 6) 20, 30, 40,
    lst1.merge(lst2);    // 合并lst2到lst1并清空lst2
    cout << "7) "; PrintList(lst1); cout << endl;    // 7) 1, 3, 4, 20, 30, 40,
    cout << "8) "; PrintList(lst2); cout << endl;    // 8)
    lst1.reverse();
    cout << "9) "; PrintList(lst1); cout << endl;    // 9) 40, 30, 20, 4, 3, 1,
    lst2.push_back(100); lst2.push_back(200);
    lst2.push_back(300); lst2.push_back(400);
    list<A>::iterator p1, p2, p3;
    p1 = find(lst1.begin(), lst1.end(), 3);
    p2 = find(lst2.begin(), lst2.end(), 200);
    p3 = find(lst2.begin(), lst2.end(), 400);
    lst1.splice(p1, lst2, p2, p3);  // 将[p2, p3) 插入p1之前,并从lst2中删除[p2, p3)
    cout << "10) "; PrintList(lst1); cout << endl;   // 10) 40, 30, 20, 4, 200, 300, 3, 1,
    cout << "11) "; PrintList(lst2); cout << endl;   // 11) 100, 400, 
    return 0;
}

deque容器

  • 双向队列
  • 必须包含头问价#include<deque>
  • 所有适用于vector的操作 -> 都适用于deque
  • deque还有push_front(将元素插入到容器头部)和pop_front(删除头部元素)操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值