C++ STL一一list

一、list特点

优点:任何位置上执行元素的安插或删除都非常快。

缺点:不支持随机存取,所以既不支持下标操作符,也不提供at()

list并未提供容量、空间重新分配等相关操作,因为全无必要,每个元素都有自己的内存,在被删除之前一直有效。

二、list的构造和析构

list<Elem> c;           //产生一个空list,其中没有任何元素  
list<Elem> c1(c2);  //产生另一个同型list的副本(所有元素都被拷贝)  
list<Elem> c(n);        //利用元素的default构造函数产生一个大小为n的list  
list<Elem> c(n,elem); //产生一个大小为n的list,元素均为elem  
list<Elem> c(beg,end); //产生一个list,以区间[beg,end]作为元素初值  
c.~list<Elem>();       //销毁所有元素,并释放内存 
三、非变动性操作(同理也提供询问大小,两相比较等相关操作)

c.size()   //返回当前元素数量  
c.empty()  //判断大小是否为0  
c.max_size() //返回可容纳的元素最大数量 
四、赋值操作

c1 = c2  //将c2的元素全部赋值给c1  
c.assign(n,elem);  
c.assign(beg,end);  
c1.swap(c2);  
swap(c1,c2); 
五、元素存取

list不支持随机存取,只有front()和back()能够存取元素

c.front() //返回第一个元素,不检查元素是否存在
c.back()  //返回最后一个元素,不检查元素是否存在
由于上述操作都不检查元素是否存在,所以在使用的时候需要保证元素不为NULL

std::list<elem> coll;
if(coll.empty())
{
    std::cout<<coll.back();
}
六、迭代器相关函数

c.begin() //返回一个随机存取迭代器,指向第一个元素  
c.end()   //返回一个随机存取迭代器,指向最后元素的下一位置  
c.rebegin() //返回一个逆向迭代器,指向逆向迭代的第一个元素  
c.rend()    //返回一个逆向迭代器,指向逆向迭代的最后元素的下一位置  
七、元素的安插和移除
list提供deque的所有功能,同时还增加了remove()和remove_if()算法应用于list身上的特殊版本

c.insert(pos,elem) //在pos位置插入一个elem副本,并返回新元素位置    
c.insert(pos,n,elem) //在pos位置插入n个elem副本,无回传值    
c.insert(pos,beg,end) //在pos位置上插入区间[beg,end]内的所有元素副本,无回传值    
c.push_back(elem) //在尾部添加一个elem副本    
c.pop_back() //移除最后一个元素(但不回传)    
c.push_front(elem) //在头部插入elem的一个副本  
c.pop_front() //移除头部元素  
c.remove(val) //移除所有其值为val的值
c.remove_if(op) //移除所有“造成op(elem)结果为true”的元素
c.erase(pos) //移除pos位置上的元素,返回下一元素的位置    
c.erase(beg,end) //移除[beg,end]区间的所有元素,返回下一元素的位置    
c.resize(num) //将元素数量改为num(如果size()变大了,多出来的新元素都需default构造函数完成)    
c.resize(num,elem) //将元素数量改为num(如果size()变大了,多出来的新元素都是elem)    
c.clear() //移除所有元素,将容器清空 
移除所有值为val的元素:

std::list<elem> coll;
coll.remove(val);
移除“与某值相等”的第一个元素

list.remove_if(not1(bind2nd(modulus<int>(),2)));
八、list特殊变动性操作

c.unique() //如果存在若干相邻而数值相等的元素,就移除重复元素,只留下一个
c.unique(op) //如果存在若干相邻元素,都使op()为true,则移除重复元素,只留下一个
c1.splice(pos,c2) //将c2内的所有元素转移到c1之内、迭代器pos之前
c1.splice(pos,c2,c2pos) //将c2内的c2pos所指元素转移到c1内的pos所指位置上(c1和c2可相同)
c1.splice(pos,c2,c2.beg,c2.end) //将c2内的[c2beg,c2end]区间内所有元素转移到c1内的pos之前(c1和c2可相同)
c.sort() //以operator<为准则,对所有元素排序
c.sort(op) //以op()为准则,对所有元素排序
c1.merge(c2) //假设c1,c2都包含已序元素,将c2的全部元素转移到c1,并保证合并后的list仍为有序
c1.merge(c2,op) //假设c1,c2都包含op()原则下的已序元素,将c2的全部元素转移到c1,并保证合并后的list仍为有序
c.reserve() //将所有元素反序
九、运行实例

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

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

int main()
{
    // create two empty lists
    list<int> list1, list2;

    // fill both lists with elements
    for (int i=0; i<6; ++i) {
        list1.push_back(i);
        list2.push_front(i);
    }
    printLists(list1, list2);

    // insert all elements of list1 before the first element with value 3 of list2
    // - find() returns an iterator to the first element with value 3
    list2.splice(find(list2.begin(),list2.end(),  // destination position
                      3),
                 list1);                          // source list
    printLists(list1, list2);

    // move first element to the end
    list2.splice(list2.end(),        // destination position
                 list2,              // source list
                 list2.begin());     // source position
    printLists(list1, list2);

    // sort second list, assign to list1 and remove duplicates
    list2.sort();
    list1 = list2;
    list2.unique();
    printLists(list1, list2);

    // merge both sorted lists into the first list
    list1.merge(list2);
    printLists(list1, list2);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值