《STL标准程序库》笔记8-List

Lists

List使用一个doubly linked list(双向串列)来管理元素。

list头文件<list>

其中list类型定义与namespace std中,是个class template

namespace std{
template <class T, class Allocator = allocator<T> >

class list;

}

任何类型T主要具备assignablecopyable,就可以作为list的元素。

Lists的能力

List的内部结构和vectordeque截然不同,所以在几个主要方面与前述二者存在明显区别:

List不支持随机存取。

任何位置上插入或删除元素非常快,实际上内部只进行了指针操作。

插入和删除动作并不会造成pointers等实现。

List异常处理方式:要么成功要么什么都不发生。

Lists所提供的成员函数反映出它和vectors以及deques的不同:

由于不支持随机存取,不提供subscript(下标)操作符、at()

List并未提供容量、容间重新分配等操作函数。

List提供了不少特殊的成员函数,专门用于移动元素。

元素存取(Element Access

list不支持随机存取,只有front()back()能够直接存取元素。这些操作并不检查容器是否为空。会导致未定义的行为:

std::list<Elem> coll;

std::cout << coll.front(); // RUNTIME ERROR

if( !coll.empty() ) {

std::cout << coll.back();

}

迭代器相关函数(Iterator Functions

只有运用迭代器,才能够存取list中的各个元素。然而由于list不能随机存取,这些迭代器只是双向迭代器。所以凡是通道随机存取迭代器的演算法(所有用来操作元素顺序的演算法——特别是排序演算法)你都不能调用。不过你可以拿list的特殊成员函数sort()取代。

元素的插入(Inserting)和删除(Removing

Lists提供了deques的所有功能,还增加了remove()remove_if()演算法应用于list身上的特殊版本。

想要将所有与某值相等的元素删除,可以这么做:

std::list<Elem> coll;

coll.remove(val);

Splice函数

操作

效果

c.unique()

如果存在若干相邻而数值相同的元素,就删除重复元素,只留下一个。

c.unique(op)

如果存在若干相邻元素,都使op()的结果为true,则删除重复元素,只留下一个。

c1.splice(pos,c2)

c2内的所有元素转移到c1之内,迭代器pos之前。

c1.splice(pos,c2,c2beg,c2end)

c2内的[c2beg,c2end)区间内所有元素转移到c1内的pos之前

c1.splice(pos,c2,c2pos)

c2内的c2pos所指元素转移到c1内的pos所指位置上

c.sort()

operator<为准则排序。

c.sort(op)

op()为准则排序。

c1.merge(c2)

假设c1c2容器都包含已序(sorted)元素,将c2的全部转移到c1,并保证已序。

c1.merge(c2,op)

...

c.reverse()

将所有元素反序(reverse the order

Lists运用示例:

#include <iostream>

#include <list>

#include <algorithm>

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()

{

list<int> list1, list2;

for(int i=0; i<6; ++i) {

list1.push_back(i);

list2.push_front(i);

}

printLists(list1,list2);

list2.splice(find(list2.begin(),list2.end(),3),list1);

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值