STL容器之List

List,链表。
使用一个双向链表double-linked list来管理元素。

熟悉的声明
namespace std{
    template <class T, class Allocator = allocator<T> >
    class list;
}

1.List的能力
# 不支持随机存取
   不支持operator[]、at()等下标subscript操作
    它的迭代器也不是随机存取迭代器,而是双向迭代器
    所以用到随机存储迭代器的算法也不能调用
# 在任何位置的插入删除效率高,常数时间完成
  内部指针操作,无需移动任何其他元素
# 安插删除不会造成其他pointer、reference、iterator失效
# 不提供容量、空间重新分配等操作
# 提供不少特殊函数专门用于移动元素,较之同名的算法函数,效率更高

2.操作函数

构造和析构
list<Elem> t;    list<Elem> t(n);    list<Elem> t(t1);
list<Elem> t(n,elem);            list<Elem> t(beg,end);
t.~list<Elem>();

Nonmodifying Operations:
t.size();        t.empty();        t.maxsize();
Comparison Operator;

Assignment:
t = t1;        t.assign(n,elem);        t.assign(beg,end);
t.swap(t1);    swap(t,t1);

Element Access:
t.front();    t.back();
由于不做空指针检查,推荐如下使用
if(!t.empty()){
    cout<<t.back()<<endl;
}

Iterator Functions
t.begin();    t.end();
t.rbegin();    t.rend();

Insetting and Remove
List提供Deque的所有功能,还增加了remove()和remove_if()运用在List的特殊版本。
List特别配置的remove算法的特别版本,作为成员函数,它们比remove算法效率更高。

t.insert(pos,elem);    t.insert(pos,n,elem);    t.insert(pos,beg,end);
t.push_back(elem);    t.push_front(elem);
t.pop_back();        t.pop_front();
t.remove(val);        t.remove(op);      //op为一个判断式
t.erase(pos);        t.erase(beg,end);
t.resize(num);        t.resize(num,elem);
t.clear();

例子:
remove_if(not1(bind2nd(modulus<int>(),2)));   //删除取余2不等以1的所有元素

Special Modifying Operations
t.unique();//删除重复数据       t.unique(op);//删除连续满足op判断式的重复元素
t.splice(pos,t1);    t.plice(pos,t1,t1pos);    t.splice(pos,t2,t2begin,t2end);
t.sort();            t.sort(op);            //以op为准则或者以默认operator<为准则排序
t.merge(t1);        t.merge(t1,op);        //以op准则合并表
t.reverse();        //list reverse

3.实例

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

void printLists(const list<int>& t1,const list<int> t2){
    cout<<"List1:"<<endl;
    copy(list1.begin(),list1.end(),ostream_iterator<int>(cout," "));
    cout<<endl<<"List2:"<<endl;
    copy(list2.begin(),list2.end(),ostream_iterator<int>(cout," "));
    cout<<endl;
}

int main(){
    list<int> list1,list2;
    for(i = 0; i< 6; ++i){
        list1.push_back(i);
        list2.push_front(i);
    }
    printLists(list1,list2);

    list2.splice(list2.end(),list2,list2.begin());
    printLists(list1,list2);

    list2.sort();
    list1 = list2;
    list2.unique();
    printLists(list1,list2);

    list1.merge(list2);
    printLists(list1,list2);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值