STL之list

来源:互联网 发布:微信小说分销源码下载 编辑:程序博客网 时间:2024/05/16 05:50

前言

list是双向链表容器。当经常从容器的中间插入元素或者删除元素时,非常高效。

#include <list>

list基础

list定义模板
template < class T, class Allocator = allocator< T>>class list
T是存储的元素的数据类型;Allocator指定了分配器,默认是标准分配器。

list构造函数
explicit list(const Allocator &a = Allocator());
构造空的list
explicit list(size_type num,const T &val = T(),const Allocator &a = Allocator());
构造含有num个元素,元素值为val的list
list(const list< T,Allocator> &ob);
list的拷贝构造函数
template < class InIter> list(InIter start,InIter end, const Allocator &a = Allocator());
构造list含有的元素由start和end指定范围内的元素组成

list重载了赋值操作符和比较操作符:
==,<,<=,!=,>,>=

list不支持随机访问操作,不提供at()函数,也不支持[]操作符。

list具体类型

size_type整数类型difference_type能够区分两个地址不同的整数类型reference元素的引用(T&)const_reference元素的常量引用(const T&)iterator迭代器const_iteratorconst迭代器reverse_iterator反向迭代器const_reverse_iteratorconst反向迭代器value_type存储在容器中值的类型(T)allocator_type分配器类型pointer指向元素的指针const_pointer指向元素的常量指针(const T*)

性能特点
在list中插入和删除操作是个常量时间。
删除操作只会导致指向被删除元素的迭代器和被删除元素的引用失效,不会影响其他仍然存在元素的迭代器和引用

list成员函数

template < class InIter >
template < class Comp>

void assign(InIter start,InIter end)将start和end之间的序列赋值给listvoid assign(size_type num, const T &val)将num个值为val的元素赋值给listreference back();
const_reference back() const返回list中最后一个元素的引用iterator begin();
const_iterator begin() const返回list中第一个元素的迭代器void clear()删除list中所有元素bool empty() const如果调用list是空返回true,否则返回falseiterator end();
const_iterator end() const返回list指向尾部的迭代器iterator erase(iterator i)删除指向i的元素,返回迭代器,迭代器指向元素为被删除元素的下一个元素iterator erase(iterator start,iterator end)删除start和end之间的元素。返回迭代器,此迭代器起始位置指向最后一个被删除元素的下一个元素reference front();
const_reference front() const返回list中第一个元素的引用allocator_type get_allocator() const返回list的分配器iterator insert(iterator i, const T &val = T())在元素i之前插入值为val的元素。返回指向该元素的迭代器void insert(iterator i,size_type num, const T &val)在元素i之前插入num个值为val的元素void insert(iterator i, InIter start,InIter end)在元素i之前插入由start和end定义的的序列size_type max_size() const返回list能保存的最大元素个数void pop_back()删除list中最后一个元素void pop_front()删除list中第一个元素void push_back(const T &val)将值为val的元素加入到list尾部void push_front(cosnt T &val)将值为val的元素加入到list的头部reverse_iterator rbegin();
const_reverse_iterator rbegin() const;返回一个反向迭代器,指向list结束位置void remove(const T&val)从list中删除值为val的元素template void remove_if(UnPred pr)删除pr判定为true的元素reverse_iterator rend();
const_reverse_iterator rend() const返回反向迭代器,指向list起始位置void resize(size_type num, T val = T())改变list的大小为num,如果list扩容了,那么新增值为val的元素直到list结束位置void reverse()反向调用listsize_type() size() const返回list中当前元素个数void sort();
template
void sort(Comp cmpfn)排序list。第二个list排序,使用比较函数cmpfn去判断某个元素比另一个元素小void unique();
template
void unique(BinPred pr)从调用list中删除重复元素。第二个函数形式是使用pr去判断什么时候两个元素时重复的


void merge( list< T, Allocator> &ob);
void merge( < list< T, Allocator> &ob , Comp cmpfn > ) ;
将有序list ob和调用list进行合并,合并后的结果也排好序。合并完后,ob为空。
第二种形式,将由cmpfn函数来进行比较,判断元素是否小于另一个元素。
注意:第一种形式的merge函数要求调用list和ob都必须是已拍好序的list,这样当调用merge后,结果才会也是排好序的。如果调用list是非排好序的,则调用merge后的结果list也是无序的。

void splice(iterator i,list < T, Allocator> &ob)
将ob的内容插入到调用list的位置i处,插入完成后,ob为空

void splice(iterator i,list < T, Allocator> &ob,iterator el)
从ob中删除由el指向的元素,并将el元素存储到调用list的位置i处

void splice(iterator i,list < T, Allocator> &ob,iterator start,iterator end)从ob中删除由start和end定义的范围序列,并存储到调用list中,存储位置从i位置开始

void swap(list < T,Allocator> &ob)
交换调用list和ob之间的元素

Example

    list<int> l;    list<int> ob;    int i = 0;    list<int>::iterator p;    for (i=0;i<10;i++)    {        l.push_back(i);    }    for (i=5;i<15;i++)    {        ob.push_back(i);    }    cout<<"initial contents of l:\n";    p = l.begin();    while (p!=l.end())    {        cout<<*p<<" ";        p++;    }    cout<<"\n\n";    cout<<"initial contents of ob:\n";    p = ob.begin();    while (p!=ob.end())    {        cout<<*p<<" ";        p++;    }    cout<<"\n\n";    //merge    l.merge(ob);    cout<<"after merge,size of ob: "<<ob.size()<<"\n\n";    cout<<"after merge,contents of l: \n";    p = l.begin();    while (p!=l.end())    {        cout<<*p<<" ";        p++;    }
0 0