list使用要点
list使用一个doubly linked list(双向链表)管理元素,任何具备assignable和copyable两个性质的类型T,都可以作为list的元素。
list的内部结构与vector和deque截然不同:
1. 不支持随机存取。如果要存取第5个元素,就得顺着串链依次爬过前4个元素。所以list的遍历是很缓慢的行为。
2. 任何位置上的插入和删除都非常快。
3. 插入和删除操作不会造成指向其它元素的pointers、references、iterators失效。
list包含很多成员函数,但由于不支持随机存取,所以不提供subscript(下标)操作符,也不提供at()。另外,list提供了很多特殊的更易型成员函数,这些函数是vector或deque所不具备的。比如unique()、splice()、sort()、merge()、reverse()。
使用示例:
#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); }