【C++指南】STL list容器完全解读(一):从入门到掌握基础操作

06-02 731阅读

.

💓 博客主页:倔强的石头的CSDN主页

📝Gitee主页:倔强的石头的gitee主页

⏩ 文章专栏:《C++指南》

期待您的关注 【C++指南】STL list容器完全解读(一):从入门到掌握基础操作

文章目录

    • 一、初识list容器
      • 1.1 什么是list?
      • 1.2 核心特性
      • 1.3 典型应用场景
      • 二、核心成员函数
        • 2.1 默认成员函数
        • 三、迭代器操作
          • 3.1 基础迭代器
          • 3.2 常量迭代器(C++11)
          • 四、容量与访问操作
            • 4.1 容量查询
            • 4.2 元素访问
            • 五、修改操作详解
              • 5.1 基础修改函数
              • 5.2 高级修改操作
              • 5.3 插入与删除
                • insert重载版本
                • erase操作
                • 六、特殊成员函数
                  • 6.1 条件操作
                  • 6.2 链表特有操作
                  • 七、总结与进阶

                    一、初识list容器

                    1.1 什么是list?

                    在C++标准模板库(STL)中,list是一个基于双向链表实现的序列容器。它允许在任意位置进行高效插入和删除操作,时间复杂度为O(1)。与vector不同,list不保证元素在内存中的连续存储,因此不支持随机访问。

                    【C++指南】STL list容器完全解读(一):从入门到掌握基础操作

                    1.2 核心特性

                    • 双向链表结构:每个元素包含指向前后节点的指针
                    • 动态内存分配:元素按需分配内存
                    • 高效插入删除:无需移动其他元素
                    • 迭代器稳定性:插入删除操作不会使已有迭代器失效(除被删除元素)

                      1.3 典型应用场景

                      • 需要频繁在首尾之外的位置插入/删除元素
                      • 元素体积较大,避免vector扩容时的拷贝开销
                      • 需要维护元素的插入顺序
                      • 需要合并、拆分链表等特殊操作

                        二、核心成员函数

                        2.1 默认成员函数

                        【C++指南】STL list容器完全解读(一):从入门到掌握基础操作

                        构造函数的重载版本

                        【C++指南】STL list容器完全解读(一):从入门到掌握基础操作

                        函数功能描述示例
                        默认构造函数创建空listlist lst1;
                        填充构造函数创建包含n个元素的listlist lst2(5);
                        拷贝构造函数复制另一个list的内容list lst3(lst2);
                        移动构造函数(C++11)转移另一个list的资源list lst4(move(lst3));
                        析构函数自动释放内存(通常无需手动调用)lst1.~list();
                        拷贝赋值运算符深拷贝赋值操作lst2 = lst1;
                        移动赋值运算符(C++11)高效转移资源赋值操作lst3 = move(lst2);
                        // 初始化列表构造(C++11)
                        list fruits {"apple", "banana", "cherry"};
                        

                        三、迭代器操作

                        【C++指南】STL list容器完全解读(一):从入门到掌握基础操作

                        3.1 基础迭代器

                        函数功能示例
                        begin()返回指向第一个元素的迭代器auto it = lst.begin();
                        end()返回末尾哨兵迭代器while(it != lst.end())
                        rbegin()返回反向起始迭代器auto rit = lst.rbegin();
                        rend()返回反向结束迭代器for(; rit != lst.rend();)

                        3.2 常量迭代器(C++11)

                        函数功能示例
                        cbegin()返回不可修改的正向起始迭代器auto cit = lst.cbegin();
                        cend()返回不可修改的正向结束迭代器if(cit == lst.cend())
                        crbegin()返回不可修改的反向起始迭代器auto crit = lst.crbegin();
                        crend()返回不可修改的反向结束迭代器while(crit != lst.crend())
                        list nums {1,2,3};
                        // 正向遍历
                        for(auto it = nums.begin(); it != nums.end(); ++it) {
                            cout 36.5, 37.1, 38.0};
                        temps.front() = 35.9;  // 修改首元素
                        cout 
                        public:
                            Student(int id, string name) : id(id), name(name) {}
                        private:
                            int id;
                            string name;
                        };
                        list1,2,3});       // 内容变为[1,2,3]
                        nums.resize(5);             // 变为[1,2,3,0,0]
                        nums.resize(3);             // 截断为[1,2,3]
                        10,20,30};
                        auto it = data.begin();
                        advance(it, 1);
                        data.insert(it, 15);        // [10,15,20,30]
                        data.insert(it, 2, 18);     // [10,15,18,18,20,30]
                        vector25,35};
                        data.insert(data.end(), tmp.begin(), tmp.end()); // 末尾追加
                        data.erase(it);             // 删除第二个18
                        1,2,3,2,5};
                        nums.remove(2);  // 删除所有2 → [1,3,5]
                        nums.remove_if([](int x){ return x3; }); // → [1,3]
                        1,3,5}, b {2,4,6};
                        a.merge(b);       // a变为[1,2,3,4,5,6], b为空
                        a.sort();         // 排序(若未有序)
                        list10,20}, y {30,40};
                        auto pos = x.begin();
                        x.splice(pos, y); // x变为[30,40,10,20], y为空
                        
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码