【C++】std::list

std::list:

std::list 是 C++ 标准库中的一个双向链表容器,它是顺序容器中的一种。与其他顺序容器如 std::vectorstd::deque 不同,std::list 在插入和删除操作上具有显著的优势,特别是在容器的中间部分。

特性

  1. 双向链表 : std::list 使用双向链表实现,每个元素包含指向前一个元素和后一个元素的指针。这使得在链表的任意位置进行插入和删除操作都具有 O(1) 的时间复杂度。

  2. 非随机访问 : std::list 不支持通过下标随机访问元素。只能通过迭代器进行访问,这意味着访问某个位置的元素需要 O(n) 时间。

  3. 动态大小: 容器大小可以动态调整。

  4. 稳定的迭代器 : 在对 std::list 进行插入和删除操作时,除了被删除的迭代器外,其余迭代器保持有效。

常用操作

1. 创建和初始化
cpp 复制代码
#include <list>
#include <iostream>

int main() {
    // 创建一个空的 list
    std::list<int> lst1;

    // 创建一个初始化为 5 个元素的 list,元素值为 10
    std::list<int> lst2(5, 10);

    // 使用初始化列表创建 list
    std::list<int> lst3 = {1, 2, 3, 4, 5};

    return 0;
}

2. 访问和修改元素

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

int main() {
    std::list<int> lst = {1, 2, 3, 4, 5};

    // 使用迭代器遍历 list
    for (auto it = lst.begin(); it != lst.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 修改元素
    auto it = lst.begin();
    ++it; // 移动到第二个元素
    *it = 20;

    std::cout << "Modified list: ";
    for (const auto& elem : lst) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

3. 添加和删除元素

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

int main() {
    std::list<int> lst = {1, 2, 3, 4, 5};

    // 在末尾添加元素
    lst.push_back(6);

    // 在前面添加元素
    lst.push_front(0);

    // 删除末尾元素
    lst.pop_back();

    // 删除前面元素
    lst.pop_front();

    std::cout << "List after push and pop operations: ";
    for (const auto& elem : lst) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

4. 插入和删除指定位置的元素

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

int main() {
    std::list<int> lst = {1, 2, 3, 4, 5};

    // 插入元素
    auto it = lst.begin();
    ++it; // 移动到第二个位置
    lst.insert(it, 10); // 在第二个位置插入 10

    // 删除指定位置的元素
    it = lst.begin();
    ++it; // 移动到第二个位置
    lst.erase(it); // 删除第二个位置的元素

    std::cout << "List after insert and erase operations: ";
    for (const auto& elem : lst) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}
5. 其他常用方法
  • size(): 返回 list 中元素的数量。
  • empty(): 判断 list 是否为空。
  • clear(): 清空 list 中的所有元素。
  • front(): 访问 list 的第一个元素。
  • back(): 访问 list 的最后一个元素。
  • resize(): 调整 list 的大小,多余的元素会被删除,不足的地方会使用默认构造函数初始化。

示例:

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

int main() {
    std::list<int> lst = {1, 2, 3, 4, 5};

    // 输出前端和后端元素
    std::cout << "Front element: " << lst.front() << std::endl;
    std::cout << "Back element: " << lst.back() << std::endl;

    // 修改前端和后端元素
    lst.front() = 10;
    lst.back() = 50;

    std::cout << "Modified front element: " << lst.front() << std::endl;
    std::cout << "Modified back element: " << lst.back() << std::endl;

    // 调整大小
    lst.resize(8, 0); // 增加元素,并用 0 填充
    std::cout << "Size after resizing to 8: " << lst.size() << std::endl;

    return 0;
}
相关推荐
吴_知遇30 分钟前
【华为OD机试真题】428、连续字母长度 | 机试真题+思路参考+代码解析(E卷)(C++)
开发语言·c++·华为od
LaoWaiHang1 小时前
MFC案例:使用键盘按键放大、缩小窗口图像的实验
c++·mfc
basketball6161 小时前
Python torchvision.transforms 下常用图像处理方法
开发语言·图像处理·python
到底怎么取名字不会重复1 小时前
Day10——LeetCode15&560
c++·算法·leetcode·哈希算法·散列表
宁酱醇1 小时前
各种各样的bug合集
开发语言·笔记·python·gitlab·bug
啊吧怪不啊吧1 小时前
Linux常见指令介绍下(入门级)
linux·开发语言·centos
谷晓光1 小时前
Python 中 `r` 前缀:字符串处理的“防转义利器”
开发语言·python
Tiger Z1 小时前
R 语言科研绘图第 41 期 --- 桑基图-基础
开发语言·r语言·贴图
chuxinweihui2 小时前
数据结构——二叉树,堆
c语言·开发语言·数据结构·学习·算法·链表
陈大大陈2 小时前
基于 C++ 的用户认证系统开发:从注册登录到Redis 缓存优化
java·linux·开发语言·数据结构·c++·算法·缓存