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);
}

 

 

posted on 2012-12-13 16:34  zhuyf87  阅读(292)  评论(0编辑  收藏  举报

导航