C++学习笔记 —— STL之list(链表)

https://www.cnblogs.com/scandy-yuan/archive/2013/01/08/2851324.html
实际上,list容器就是一个双向链表,可以高效地进行插入删除元素。O(1)复杂度
链表list插入和删除永远是常数时间,采取动态分配不会浪费资源,
list是一个双向循环链表
非连续空间
头节点不保存数据

#include <iostream>
#include <list>
#include <vector>
#include <algorithm>
// 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,

}

猜你喜欢

转载自blog.csdn.net/chongbin007/article/details/106151921