【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;
}
相关推荐
yufei-coder6 分钟前
C#基础语法
开发语言·c#·.net
长天一色6 分钟前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript
sukalot15 分钟前
windows C++-windows C++-使用任务和 XML HTTP 请求进行连接(二)
c++·windows
_.Switch17 分钟前
Python机器学习模型的部署与维护:版本管理、监控与更新策略
开发语言·人工智能·python·算法·机器学习
醉颜凉20 分钟前
银河麒麟桌面操作系统修改默认Shell为Bash
运维·服务器·开发语言·bash·kylin·国产化·银河麒麟操作系统
NiNg_1_23426 分钟前
Vue3 Pinia持久化存储
开发语言·javascript·ecmascript
带带老表学爬虫34 分钟前
java数据类型转换和注释
java·开发语言
qianbo_insist37 分钟前
simple c++ 无锁队列
开发语言·c++
zengy538 分钟前
Effective C++中文版学习记录(三)
数据结构·c++·学习·stl
BigYe程普1 小时前
我开发了一个出海全栈SaaS工具,还写了一套全栈开发教程
开发语言·前端·chrome·chatgpt·reactjs·个人开发