C++学習ノート——STLのリスト(チェーンテーブル)

18828 ワード

https://www.cnblogs.com/scandy-yuan/archive/2013/01/08/2851324.html実際、listコンテナは双方向チェーンテーブルであり、削除要素の挿入を効率的に行うことができます.O(1)複雑度チェーンテーブルlist挿入と削除は常に定数時間であり,動的割り当てではリソースを浪費せず,listは双方向循環チェーンテーブル非連続空間ヘッダノードでデータを保存しない
#include 
#include 
#include 
#include 
// g++ -std=c++11 list.cc -o test && test.exe
using namespace std;


//  
void traverse(list<int> l)
{
    for (auto it = l.begin(); it != l.end(); it++) {
        cout << *it << ", ";
    }
    cout << endl;
}
//      
void reverseTraverse(list<int> l)
{
    // c.rbegin()                  , c             。
    for (auto it = l.rbegin(); it != l.rend(); it++) {
        cout << *it << ", ";
    }
    cout << endl;
}
int main()
{
    //   
    list<int> c0;                        //   
    list<int> c1(3);                     //          0      
    list<int> c2(5, 2);                  //           ,   2
    list<int> c3(c2);                    //   c2 copy  
    list<int> c4(c1.begin(), c1.end());  //  c1       [_First, _Last)
    // vector  list 
    vector<int> test3(10, 2);
    list<int> c5(test3.begin(), test3.end());
    traverse(c5);
    list<int> c6{1, 2, 3, 4, 5};  //       

    //  : vector
    //   :            ,            
    c6.insert(c6.begin(), 1000);  //       1000 [1000, 1, 2, 3, 4, 5]
                                  //       ,    advance       
    auto it = c6.begin();
    advance(it, 2);       //       2 
    c6.insert(it, 1001);  // [2]      1000 [1000, 1, 1001, 2, 3, 4, 5]

    //  :
    //          
    list<int> c9{4, 2, 3, 4, 4};
    c9.remove(4);//[2, 3]       4

    //     , vector
    auto it1 = c6.begin();
    advance(it1, 2);
    c6.erase(it1);  //    [2]     ,                iterator  
    traverse(c6);   // [1000, 1, 2, 3, 4, 5]

    //    :  vector            ,vector     
    c6.push_back(6);
    c6.push_front(7);
    traverse(c6);
    cout << "begin: " << *c6.begin() << endl;  //       iterater
    cout << "end: " << *c6.end() << endl;  //              iterater,             
    cout << "front: " << c6.front() << endl;  // 2      
    cout << "back: " << c6.back() << endl;    // 4        
    c6.pop_back();                            //        
    c6.pop_front();                           //       

    //  :
    //  
    swap(c6, c5);
    
    //  ,   vector,         
    c5.sort(); //     
    // c5.sort(cmp);
    traverse(c5);

    //  
    list<int> c7{6, 2, 3, 1, 5};
    c7.splice(c7.end(), c5); //c5  c7      ,   c5
    traverse(c7);
//     auto it2 = c7.begin();
//     advance(it2, 2);
//     c7.splice(it2, c5);  // c5   c7        ,  c5

     //    
     list<int> c8{1, 2, 3, 4, 5};
     c8.reverse(); //5, 4, 3, 2, 1,

}