• C++学习:list


    1.list的定义和结构

    list的使用频率不高,在做题时几乎遇不到需要使用list的情景。list是一种双向链表容器,它是标准模板库(STL)提供的一种序列容器。list容器以节点(node的形式存储元素,并使用指针将这些节点链接在一起,形成一个链表结构。list容器结构如下:

    在这里插入图片描述

    list容器模板接受两个参数:
    1.T:指定容器中存储的元素类型。 list
    2.Allocator(可选):指定用于分配内存的分配器类型,默认为std::allocator
    一般不用填

    list容器的特点包括:·双向性:每个节点都包含指向前一个节点和后一个节点的指针,因此可以在常数时间内在链表中的任意位置进行插入、删除和访问操作。动态大小:链表的大小可以根据需要动态扩展或收缩,不需要预先指定容器的大小。

    不连续存储:链表中的节点可以在内存中的任意位置分布,不要求连续存储,因此插入和删除操作不会导致元素的移动。如 1 22 33 35 63…
    list容器提供了一系列成员函数和迭代器来操作和访问链表中的元素,包括插入删除、访问、反转等操作。可以使用迭代器来遍历链表中的元素。

    #include 
    #include
    int main(){
    	std::list mylist;
    // 在链表尾部插入元素
    	myList.push_back(1);
    	myList.push_back(2);
    	myList.push_back(3);
    // 在链表头部插入元素myList.push front(@);
    //遍历链表并输出元素
    	for(int num :myList)
    	{std::cout<< num << " ";}
    	std::cout << std::endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在上述示例中,我们首先创建了一个list容器myList,然后使用push_back()和push_front()函数分别在链表尾部和头部插入元素。最后,使用范围基于范围的for循环遍历链表并输出元素。需要注意的是,由于list是双向链表,因此插入和删除操作的时间复杂度是常量时间O(1),但访问和查找操作的时间复杂度是线性时间O(n),其中n是链表的大小。因此,如果需要频繁进行随机访问操作,可能更适合使用支持随机访问的容器,如vector或deque(双端队列)

    list容器提供了多个常用的成员函数来操作和访问链表中的元素以下是一些常用的list函数的解释:
    1.push_back():将元素插入到链表的末尾。
    2.push front():将元素插入到链表的开头。
    3.pop back():移除链表末尾的元素。
    4.pop front():移除链表开头的元素。
    5.size():返回链表中元素的个数。
    6.empty():检查链表是否为空。
    7.clear():清空链表中的所有元素。
    8.front():返回链表中第一个元素的引用。
    9.back():返回链表中最后一个元素的引用。
    10.begin():返回指向链表第一个元素的迭代器。
    11.end():返回指向链表末尾的下一个位置的迭代器。
    12.insert():在指定位置之前插入一个或多个元素。
    13.erase():从链表中移除指定位置的一个或多个元素。

    #include
    using namespace std;
    int main(void) {
    	//创建一个list对象myList
    	listmyList;
    	//向myList尾部添加元素
    	for (int i = 1; i <= 5; ++i)
    		myList.push_back(i);
    
    
    	//从头到尾输出myList中的元素
    	for (const auto& i : myList)
    		cout << i << ' ';
    	cout << '\n';
    
    
    	//将mylist中的元素反转
    	reverse(myList.begin(), myList.end());
    
    
    	for (const auto& i : myList)
    		cout << i << ' ';
    	cout << '\n';
    
    
    	//在第一个元素的后一个位置加上元素0
    	myList.insert(++myList.begin(), 0);
    
    	for (const auto& i : myList)
    		cout << i << ' ';
    	cout << '\n';
    
    	myList.erase(++++myList.begin(), --myList.end());
    	//输出myList的大小
    	cout << "链表大小为:" << myList.size() << '\n';
    
    		//从头到尾输出myList中的元素
    	for (const auto& i : myList)
    		cout << i << ' ';
    		cout << '\n';
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    迭代器相当于是一个指针

  • 相关阅读:
    python中的asyncio使用详解与异步协程的处理流程分析
    弹性父元素2
    马上消费金融CIO蒋宁:拨云见日,金融行业大模型落地三大真核技术
    Android中级——MVVM
    初识进程以及父子进程
    BOM之location对象
    vue3中使用viewerjs实现图片预览效果
    【Linux operation 38】解决Linux 端口被占用
    Docker基本命令
    wireshark抓包并进行Eigrp网络协议分析
  • 原文地址:https://blog.csdn.net/2301_79271343/article/details/136149399