【C++】list使用

小明 2025-05-03 04:39:37 8

文章目录

  • list的介绍
  • list的使用
    • list的构造方式
    • **打印任意容器的**方法
    • **list的插入和删除**
      • **push_front和pop_front**
      • **push_back和pop_back**
      • **insert**
        • 插入**是否会导致迭代器失效问题?**
        • **erase**
          • 删除**是否会导致迭代器失效问题?**
          • **list的迭代器使用**
            • **begin和end**
            • **rbegin和rend**
            • **list的元素获取**
              • **front和back**
              • **list的大小控制**
                • **size**
                • **resize**
                • **empty**
                • **clear**
                • **list的操作函数**
                  • **sort**
                  • **splice**
                  • **remove**
                  • **remove_if**
                  • **unique**
                  • **merge**
                  • **reverse**
                  • **assign**
                  • **swap**
                  • **关于sort函数**
                      • 自定义排序方法
                      • **关于��代器分类**

                        list的介绍

                        1. list是一种可以在常数范围内O(1)在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代(双向迭代器)
                          • 任意位置的插入和删除都是O(1) list的底层是双向带头循环链表
                          • list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立结点当中,在结点中通过指针指向其前一个元素和后一个元素,
                          • list与forward_list(单链表)非常相似,最主要的不同在于forward_list是单链表,只能进行单方向迭代,
                          • 与其他容器相比,list通常在任意位置进行插入、删除元素的执行效率更高,
                          • list和forward_list最大的缺陷是不支持在任意位置的随机访问,其次,list还需要一些额外的空间,以保存每个结点之间的关联信息(对于存储的类型较小元素来说这可能是一个重要的因素)

                        list的使用

                        list的构造方式

                        list()构造空的list
                        list (size_type n, const value_type& val = value_type())构造的list中包含n个值为val的元素
                        list (const list& x)拷贝构造函数
                        list (InputIterator first, InputIterator last)用[first, last)区间中的元素构造list

                        方式一: 构造一个某类型的空容器,

                        list lt1; //构造int类型的空容器
                        

                        方式二: 构造一个含有n个val的某类型容器,

                        list lt2(10, 2); //构造含有10个2的int类型容器
                        

                        方式三: 拷贝构造某类型容器的复制品,

                        list lt3(lt2); //拷贝构造int类型的lt2容器的复制品
                        

                        方式四: 使用迭代器拷贝构造某一段内容,

                        string s("hello world");
                        list lt4(s.begin(),s.end()); //构造string对象某段迭代器区间的内容
                        

                        方式五: 构造数组某段区间的内容,

                        int arr[] = { 1, 2, 3, 4, 5 };
                        int sz = sizeof(arr) / sizeof(int);
                        list lt5(arr, arr + sz); //构造数组某段区间的复制品  ->本质是调用迭代器区间的构造函数
                        

                        原生指针可以当做天然迭代器使用,本质上vector和string的迭代器就是原生指针


                        打印任意容器的方法

                        template
                        void PrintContainer(const Con& c)
                        {
                        	//取类模板的内嵌类型,类模板没有实例化,编译器不会去找
                            //前面加typename,告诉编译器这个是一个类型
                        	typename Con::const_iterator it = c.begin();
                        	while (it != c.end())
                        	{
                        		cout 
                        	list
                        		cout 
                        		cout 
                        	list
                        		cout 
                        		cout 
                        	list
                        		cout 
                        		cout 
                        		cout 
                        	int a[] = { 1,2,3 };
                        	int sz = sizeof(a) / sizeof(a[0]);
                        	list
                        	list
                        		cout 
                        		cout 
                        	int a[] = { 1,2,3 };
                        	int sz = sizeof(a) / sizeof(a[0]);
                        	list
                            // erase()函数执行后,it所指向的节点已被删除,因此it迭代器无效,在下一次使用it时,必须先给其赋值
                            l.erase(it);
                            ++it;
                        }
                        
                        	l.erase(it++);//写法2:it = l.erase(it);
                        }
                        
                        	list
                        		cout 
                        	list
                        		cout 
                        	list
                        	list
                        	list
                        		cout 
                        		cout 
                        		cout 
                        	list
                        	list
                        		cout 
                        		cout 
                        	list
                        		cout 
                        		cout 
                        	list
                        		cout 
                        		cout 
                        		cout 
                        	list
                        		cout 
                        		cout 
                        	return val 
The End
微信