【C++进阶】深入STL之list:高效双向链表的使用技巧

2024-06-08 1732阅读

📝个人主页🌹:Eternity._

⏩收录专栏⏪:C++ “ 登神长阶 ”

🤡往期回顾🤡:探索迭代器失效

🌹🌹期待您的关注 🌹🌹

【C++进阶】深入STL之list:高效双向链表的使用技巧

【C++进阶】深入STL之list:高效双向链表的使用技巧

【C++进阶】深入STL之list:高效双向链表的使用技巧

❀STL之list

  • 📒1. list的基本概念
  • 📕2. list的常用操作
    • 🌈list的构造函数
    • 🌞list iterator的使用
    • 🌙list的常用函数
    • ⭐list的增删查改
    • 📜3. list迭代器失效
    • 📖4. 总结拓展
      • 💧拓展:迭代器的性质类型
      • 🔥总结

        在C++编程的广阔天地中,STL(Standard Template Library)以其高效、灵活和可重用的特性,成为开发者们不可或缺的工具之一。作为STL中重要的一员,list容器为我们提供了双向链表的功能,让我们在编程过程中能够更方便地处理需要频繁插入和删除元素的场景

        前言:双向链表是链表数据结构的一种重要变体,它允许我们在链表的任何位置进行高效的插入和删除操作,而无需像数组那样进行大量的数据移动。list容器正是基于这种数据结构实现的,它提供了丰富的成员函数和迭代器接口,让我们能够轻松地管理和操作链表元素

        让我们一起走进STL中list容器的世界,探索其背后的奥秘吧!

        因为前面我们学习string和vector,为list做足了铺垫,所以我们直接来看它的使用!


        📒1. list的基本概念

        list 是 C++ 标准模板库 (STL) 中的一个容器,它基于双向链表实现。双向链表是一种动态数据结构,由一系列节点组成,每个节点包含数据元素和两个指向其他节点的指针

        【C++进阶】深入STL之list:高效双向链表的使用技巧

        在介绍list的使用之前,我们先来看看它的结构:

        【C++进阶】深入STL之list:高效双向链表的使用技巧

        实际上:list就是一个带头双向链表


        📕2. list的常用操作

        🌈list的构造函数

        构造函数( (constructor))接口说明
        list (size_type n, const value_type& val = value_type())构造的list中包含n个值为val的元素
        list()构造空的list
        list (const list& x)拷贝构造函数
        list (InputIterator first, InputIterator last)用[first, last)区间中的元素构造list
        int main()
        {
            list lt1(10, 5); //构造的list中包含n个值为val的元素
            list lt2; // 构造空的list
            list lt3(lt1); // 拷贝构造函数
            list lt4(lt1.begin(), lt1.end()); // 用迭代器区间中的元素构造list
            return 0;
        }
        

        🌞list iterator的使用

        关于迭代器,我们都可以将迭代器暂时理解成一个指针,该指针指向list中的某个节点

        函数声明接口说明
        begin +end返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器
        rbegin +rend返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的reverse_iterator,即begin位置

        【C++进阶】深入STL之list:高效双向链表的使用技巧

        迭代器打印列表:

        int main()
        {
            list lt(10, 5);
        	list::iterator it = lt.begin();
            while (it != lt.end())
            {
                cout 
        	list 2,3,4,5 };
        	lt1.push_back(6);
        	lt1.push_front(1);
        	// 将值为100的元素用insert插入lt1;
        	lt1.insert(++lt1.begin(), 100);
        	// 用erase删除lt1中的一个头部元素
        	auto it1 = lt1.begin();
            it1 = lt1.erase(lt1.begin());
        	// auto it1 = lt1.begin(); // 这里出现了迭代器失效
        	while (it1 != lt1.end())
        	{
        		cout 
        	list 1,4,3,2,5 };
        	list 6,9,8,7,0 };
        	cout 
        		cout 
        		cout 
        		cout 
        		cout 
        		cout 
        		cout 
        		cout 
        	list 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
        	auto it = l.begin();
        	while (it != l.end())
        	{
        	// erase()函数执行后,it所指向的节点已被删除,因此it无效,在下一次使用it时,必须先给其赋值
        		l.erase(it);
        		++it;
        	}
        }
        
        	list 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
        	auto it = l.begin();
        	while (it != l.end())
        	{
        		it = l.erase(it);
        	}
        }
        
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]