FX-std::list

std::list 是 C++ 标准库中的一个双向链表容器,定义在 <list> 头文件中。它支持在任意位置高效地插入和删除元素,但不支持随机访问。以下是 std::list 的基本用法和一些常见操作:

1. 包含头文件

cpp 复制代码
#include <list>

2. 定义和初始化

cpp 复制代码
std::list<int> myList; // 定义一个空的 list
std::list<int> myList2 = {1, 2, 3, 4, 5}; // 使用初始化列表初始化

3. 插入元素

cpp 复制代码
myList.push_back(10); // 在末尾插入元素
myList.push_front(5); // 在开头插入元素

auto it = myList.begin();
std::advance(it, 2); // 移动迭代器到第3个位置
myList.insert(it, 15); // 在指定位置插入元素

4. 删除元素

cpp 复制代码
myList.pop_back(); // 删除末尾元素
myList.pop_front(); // 删除开头元素

auto it = myList.begin();
std::advance(it, 2); // 移动迭代器到第3个位置
myList.erase(it); // 删除指定位置的元素

myList.remove(10); // 删除所有值为10的元素

5. 访问元素

cpp 复制代码
int firstElement = myList.front(); // 访问第一个元素
int lastElement = myList.back(); // 访问最后一个元素

// 遍历 list
for (auto it = myList.begin(); it != myList.end(); ++it) {
    std::cout << *it << " ";
}

6. 大小和容量

cpp 复制代码
bool isEmpty = myList.empty(); // 检查是否为空
size_t size = myList.size(); // 获取元素个数

7. 排序和反转

cpp 复制代码
myList.sort(); // 对 list 进行排序
myList.reverse(); // 反转 list
cpp 复制代码
#include <iostream>
#include <list>

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

    // 默认升序排序
    myList.sort();
    std::cout << "升序排序: ";
    for (int val : myList) {
        std::cout << val << " ";
    }
    std::cout << std::endl;

    // 自定义降序排序
    myList.sort([](int a, int b) {
        return a > b;
    });
    std::cout << "降序排序: ";
    for (int val : myList) {
        std::cout << val << " ";
    }
    std::cout << std::endl;

    return 0;
}

8. 合并和拼接

cpp 复制代码
std::list<int> anotherList = {20, 30, 40};
myList.merge(anotherList); // 合并两个 list,合并后 anotherList 为空

myList.splice(myList.begin(), anotherList); // 将 anotherList 的元素拼接到 myList 的开头

9. 其他操作

cpp 复制代码
myList.unique(); // 删除连续重复的元素
myList.resize(10); // 调整 list 的大小

10. 示例代码

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

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

    myList.push_back(6);
    myList.push_front(0);

    for (auto it = myList.begin(); it != myList.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    myList.remove(3);
    myList.sort();
    myList.reverse();

    for (auto it = myList.begin(); it != myList.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

总结

std::list 是一个灵活的双向链表容器,适合频繁插入和删除操作的场景。由于它不支持随机访问,因此在需要随机访问时,std::vectorstd::deque 可能是更好的选择。

相关推荐
Tingjct1 分钟前
【初阶数据结构-二叉树】
c语言·开发语言·数据结构·算法
C雨后彩虹1 分钟前
计算疫情扩散时间
java·数据结构·算法·华为·面试
飞机和胖和黄1 小时前
考研之王道C语言第三周
c语言·数据结构·考研
达文汐1 小时前
【困难】力扣算法题解析LeetCode332:重新安排行程
java·数据结构·经验分享·算法·leetcode·力扣
一匹电信狗1 小时前
【LeetCode_21】合并两个有序链表
c语言·开发语言·数据结构·c++·算法·leetcode·stl
Gorgous—l1 小时前
数据结构算法学习:LeetCode热题100-多维动态规划篇(不同路径、最小路径和、最长回文子串、最长公共子序列、编辑距离)
数据结构·学习·算法
AndyHeee1 小时前
【windows使用TensorFlow,GPU无法识别问题汇总,含TensorFlow完整安装过程】
人工智能·windows·tensorflow
远程修电脑→24169767752 小时前
三角洲行动弹窗提示CPU虚拟化未开启或被占用启动腾讯游戏时出现【ACE安全中心】虚拟化相关报错
windows
188_djh2 小时前
# 15_电脑版百度网盘每次登录都显示安全验证,很麻烦,一招解决
windows·app·百度网盘·百度网盘安全验证·baidudisk
郭涤生2 小时前
C++的函数是否可以做到完全覆盖Linux和windows的跨平台
linux·c++·windows