蓝桥杯基础知识8 list

蓝桥杯基础知识8 list

01 list 的定义和结构

lits使用频率较低,是一种双向链表容器,是标准模板库(STL)提供的一种序列容器,lsit容器以节点(node)的形式存储元素,使用指针将这些节点链接在一起,形成一个链表结构。

cpp 复制代码
template<class T, class Allocator = std::allocator<T>>
class list;

list容器模板接受两个参数:

1.T:指定容器中存储的元素类型。

2.Allocator(可选):指定用于分配内存的分配器类型,默认为 std::allocator<T>。

list容器的特点包括:

双向性:每个节点都包含指向前一个节点和后一个节点的指针,因此可以在常数时间内存链表中的任意位置进行插入、删除 和 访问操作。

动态大小:链表的大小可以根据需要动态扩展 或 收缩,不需要预先指定容器的大小。

不连续存储:链表中节点可以在内存中的任意位置分布,不要求连续存储,因此插入和删除操作不会导致元素的移动。

list容器提供一个系列成员函数和迭代器来操作和访问链表中的元素,包括插入、删除、访问、反转等操作。可以使用迭代器来遍历链表中的元素。

cpp 复制代码
#include<iostream>
#include<list>

int main(){
    std::list<int> myList;
    
    // 在链表尾部插入元素
    myList.push_back(1);
    myList.push_back(2);
    myList.push_back(3);
    
    // 在链表头部插入元素
    myList.push_front(0);
    
    // 遍历链表并输出元素
    for(int num : myList){ // 0 1 2 3 
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;

}

创建一个 list容器 myList,使用push_back() 和 push_front() 函数分别在链表 和 头部插入元素。

list 是双向链表,插入和删除操作的时间复杂度是常量时间 O(1),访问和查找操作的时间复杂度是线性时间O(n),n为链表大小。

如需进行频繁访问操作,推荐 vector 或 deque。

02 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():从链表中移除指定位置的一个或多个元素。

cpp 复制代码
#include<iostream>
#include<list>
#include<algorithm>
using namespace std;

int main(){

    // 创建一个List<int>对象myList
    list<int> myList;

    // 向myList尾部添加元素
    for(int i = 1; i <= 5; ++i){
        myList.push_back(i);
    }

    // 从头到尾输出myList中的元素
    for(const auto &i : myList)cout << i << ' ';
    cout << '\n';	// 1 2 3 4 5 

    // 将myList中的元素反转
    reverse(myList.begin(), myList.end());
    
    for(const auto &i : myList)cout << i << ' ';
    cout << '\n';	// 5 4 3 2 1

    // 在第一个元素的后一个位置加上元素 0
    myList.insert(++ myList.begin(), 0);

    for(const auto &i : myList)cout << i << ' ';
    cout << '\n';

	// 删掉4到2位置的元素,左闭右开  5 0 4 3 2 1
	//								 i-> j     j<-i      
    myList.erase(++ ++myList.begin(), --myList.end());

    // 输出myList的大小	3
    cout << "链表大小:" << myList.size() << '\n';
    
    // 从头到尾输出myList中元素	5 0 1 
    for(const auto &i : myList)cout << i << ' ';
    cout << '\n';
    
    return 0;
}

可结合学习:

C++ STL标准库: std::list使用介绍、用法详解-CSDN博客

相关推荐
a***131412 小时前
redis存取list集合
windows·redis·list
愤怒的山羊13 小时前
jetcache List 缓存, json 序列化 泛型解析成了 JsonObject 处理
缓存·json·list
编程小Y15 小时前
配置Associated Domains时,需要注意哪些细节?
职场和发展·蓝桥杯
靠沿1 天前
Java数据结构初阶——Collection、List的介绍与ArrayList
java·数据结构·list
leoufung1 天前
LeetCode 61. 旋转链表(Rotate List)题解与思路详解
leetcode·链表·list
vir021 天前
P12155 [蓝桥杯 2025 省 Java B] 消失的蓝宝
java·职场和发展·蓝桥杯
bing_1582 天前
Spring Boot 项目中判断集合(List、Set、Map)不能为空且不为 null的注解使用
spring boot·后端·list
西幻凌云3 天前
认识STL序列式容器——List
开发语言·c++·stl·list·序列式容器
valan liya5 天前
C++list
开发语言·数据结构·c++·list
鸽鸽程序猿6 天前
【Redis】List类型介绍
数据库·redis·list