【C++】list的基本使用

💗个人主页💗

⭐个人专栏------C++学习

💫点击关注🤩一起学习C语言💯💫

目录

导读

[1. list基本介绍](#1. list基本介绍)

[2. list构造函数](#2. list构造函数)

[3. list迭代器](#3. list迭代器)

[4. list容量](#4. list容量)

[5. list的修改操作](#5. list的修改操作)

[6. list排序](#6. list排序)


导读

今天我们来正式学习list,了解它的一些基本使用方法。我们在之前C语言的数据结构部分,有讲过单链表和双向循环链表,有兴趣的小伙伴可以点进专栏看一下。

1. list基本介绍

C++中的list是一个双向链表容器。它允许在任意位置进行快速插入和删除操作,并且能够在常量时间内访问任意元素。

  1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
  2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。
  3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高 效。
  4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率 更好。
  5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list 的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间 开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这 可能是一个重要的因素)

2. list构造函数

在C++中,可以使用不同的构造函数来创建list对象。

1. 默认构造函数:

使用默认构造函数创建一个空的list对象。

cpp 复制代码
	std::list<T> myList;

2. 复制构造函数:

使用另一个list对象otherList创建一个新的list对象,并复制所有元素。

cpp 复制代码
std::list<T> myList(otherList);

3. 范围构造函数:

使用指定范围内的元素创建一个新的list对象。firstlast是指向范围内第一个元素和最后一个元素的迭代器。

cpp 复制代码
std::list<T> myList(first, last);

4. 初始化列表构造函数:

使用初始化列表中的值来创建一个新的list对象。

cpp 复制代码
std::list<T> myList = {val1, val2, val3, ...};

示例:

cpp 复制代码
int main() 
{
    // 默认构造函数
    list<int> myList1;

    // 复制构造函数
    list<int> myList2(myList1);

    // 范围构造函数
    list<int> myList3(myList1.begin(), myList1.end());

    // 初始化列表构造函数
    list<int> myList4 = { 1, 2, 3, 4, 5 };

    // 遍历list并打印所有元素
    for (int num : myList4) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

3. list迭代器

list容器提供了双向迭代器(bidirectional iterators),可以用于遍历和操作容器中的元素。list的迭代器支持前进(++)和后退(--)操作,并且可以跳转到任意位置。

以下是一些常用的list迭代器操作:

  1. begin():返回指向第一个元素的迭代器。
  2. end():返回指向最后一个元素之后位置的迭代器。
  3. rbegin():返回指向最后一个元素的逆向迭代器。
  4. rend():返回指向第一个元素之前位置的逆向迭代器。

示例:

cpp 复制代码
int main() 
{
    list<int> myList = { 1, 2, 3, 4, 5 };

    // 正向迭代器遍历list
    cout << "正向遍历list: ";
    list<int>::iterator itr;
    for (itr = myList.begin(); itr != myList.end(); ++itr) 
    {
        cout << *itr << " ";
    }
    cout << endl;

    // 逆向迭代器遍历list
    cout << "逆向遍历list: ";
    list<int>::reverse_iterator ritr;
    for (ritr = myList.rbegin(); ritr != myList.rend(); ++ritr) 
    {
        cout << *ritr << " ";
    }
    cout << endl;

    return 0;
}

4. list容量

使用size()函数来获取容器的大小。

empty()函数返回一个bool类型的值,如果容器为空,则返回true;否则返回false

cpp 复制代码
int main() 
{
    std::list<int> myList = { 1, 2, 3 };

    cout << "容器大小:" << size(myList) << endl;
    if (myList.empty()) 
    {
        cout << "容器为空" << endl;
    }
    else 
    {
        cout << "容器不为空" << endl;
    }

    myList.clear();
    cout << "容器大小:" << size(myList) << endl;

    if (myList.empty()) 
    {
        cout << "容器为空" << endl;
    }
    else 
    {
        cout << "容器不为空" << endl;
    }

    return 0;
}

5. list的修改操作

list是一种双向链表容器,提供了多种修改容器的操作函数。下面是一些常见的list的修改操作函数:

1. 添加元素:

  • 使用push_back(element)函数将元素添加到列表的末尾。
  • 使用push_front(element)函数将元素添加到列表的开头。
  • 使用insert(iterator, element)函数在指定的迭代器位置之前插入元素。

2. 删除元素:

  • 使用pop_back()函数删除列表的最后一个元素。
  • 使用pop_front()函数删除列表的第一个元素。
  • 使用erase(iterator)函数删除指定迭代器位置的元素。
  • 使用erase(start_iterator, end_iterator)函数删除指定范围内的元素。

3. 修改元素:

  • 使用迭代器操作符*来直接修改列表中的元素。
cpp 复制代码
int main() 
{
    list<int> my_list = { 1, 2, 3 };

    // 添加元素
    my_list.push_back(4);
    my_list.push_front(0);
    auto it = my_list.insert(++my_list.begin(), 5);
    for (auto e : my_list)
    {
        cout << e << " ";
    }
    cout << endl;

    // 删除元素
    my_list.pop_back();
    my_list.pop_front();
    my_list.erase(it);

    for (auto e : my_list)
    {
        cout << e << " ";
    }
    cout << endl;

    // 修改元素
    *++my_list.begin() = 6;

    // 打印列表元素
    for (const auto& elem : my_list) 
    {
        cout << elem << " ";
    }
    cout << endl;

    return 0;
}

6. list排序

在C++中,可以使用list容器的sort()成员函数对列表进行排序。sort()函数会根据元素的默认比较函数(operator<)来进行排序。如果列表中的元素是自定义类型,可以通过在类中重载小于操作符(operator<)来定义自定义的比较方式。

cpp 复制代码
int main() 
{
    list<int> my_list = { 5, 2, 8, 1, 4 };

    // 对列表进行升序排序
    my_list.sort();

    // 打印排序后的列表
    for (const auto& elem : my_list) 
    {
        cout << elem << " ";
    }
    cout << endl;

    // 对列表进行降序排序
    my_list.sort(greater<int>());

    for (const auto& elem : my_list)
    {
        cout << elem << " ";
    }
    cout << endl;
    return 0;
}
相关推荐
蜀黍@猿3 分钟前
C/C++基础错题归纳
c++
古希腊掌管学习的神11 分钟前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
赵钰老师11 分钟前
【R语言遥感技术】“R+遥感”的水环境综合评价方法
开发语言·数据分析·r语言
雨中rain18 分钟前
Linux -- 从抢票逻辑理解线程互斥
linux·运维·c++
就爱学编程19 分钟前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
Oneforlove_twoforjob43 分钟前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
emoji11111143 分钟前
前端对页面数据进行缓存
开发语言·前端·javascript
每天都要学信号1 小时前
Python(第一天)
开发语言·python
TENET信条1 小时前
day53 第十一章:图论part04
开发语言·c#·图论
生信圆桌1 小时前
【生信圆桌x教程系列】如何安装 seurat V5版本R包,最详细安装手册
开发语言·r语言