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

}

 

 

你可能感兴趣的:(list)