Lists
List使用一个doubly linked list(双向串列)来管理元素。
list头文件
其中list类型定义与namespace std中,是个class template:
namespace std{
template
class list;
}
任何类型T主要具备assignable和copyable,就可以作为list的元素。
Lists的能力
List的内部结构和vector或deque截然不同,所以在几个主要方面与前述二者存在明显区别:
l List不支持随机存取。
l 任何位置上插入或删除元素非常快,实际上内部只进行了指针操作。
l 插入和删除动作并不会造成pointers等实现。
l List异常处理方式:要么成功要么什么都不发生。
Lists所提供的成员函数反映出它和vectors以及deques的不同:
l 由于不支持随机存取,不提供subscript(下标)操作符、at()。
l List并未提供容量、容间重新分配等操作函数。
l List提供了不少特殊的成员函数,专门用于移动元素。
元素存取(Element Access)
list不支持随机存取,只有front()和back()能够直接存取元素。这些操作并不检查容器是否为空。会导致未定义的行为:
std::list
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
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) |
假设c1和c2容器都包含已序(sorted)元素,将c2的全部转移到c1,并保证已序。 |
c1.merge(c2,op) |
... |
c.reverse() |
将所有元素反序(reverse the order) |
Lists运用示例:
#include
#include
#include
using namespace std;
void printLists(const list
{
cout << "list1: ";
copy(l1.begin(),l1.end(),ostream_iterator
cout << endl << "list2: ";
copy(l2.begin(),l2.end(),ostream_iterator
cout << endl << endl;
}
int main()
{
list
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);
}