• C++中的List


    摘要

    C++ 标准库中的 `std::list` 是一种双向链表容器,它允许在常数时间内进行插入和删除操作,每个元素包含一个指向前一个和后一个元素的指针。这给我们开发提供了高效的插入和删除操作。

    引入头文件

    要使用 `std::list`,需要包含头文件 ``:

    #include 
    

    创建和初始化

    1. #include
    2. #include
    3. int main() {
    4. std::list<int> l1; // 默认构造函数
    5. std::list<int> l2(5, 10); // 创建包含 5 个值为 10 的元素的列表
    6. std::list<int> l3 = {1, 2, 3, 4, 5, 6}; // 列表初始化
    7. // 输出列表 l3 的内容
    8. for (int n : l3) {
    9. std::cout << n << ' ';
    10. }
    11. std::cout << std::endl;
    12. return 0;
    13. }

    常用方法和操作

    1. 插入和删除元素

    1. #include
    2. #include
    3. int main() {
    4. std::list<int> l = {1, 2, 3, 4, 5, 6};
    5. // 在末尾添加元素
    6. l.push_back(6);
    7. // 在开头添加元素
    8. l.push_front(0);
    9. // 在第三个位置插入元素
    10. auto it = l.begin();
    11. std::advance(it, 3); // 前进 3 个位置
    12. l.insert(it, 99);
    13. // 删除开头的元素
    14. l.pop_front();
    15. // 删除末尾的元素
    16. l.pop_back();
    17. // 删除特定位置的元素
    18. it = l.begin();
    19. std::advance(it, 2); // 前进 2 个位置
    20. l.erase(it);
    21. // 输出列表 l 的内容
    22. for (int n : l) {
    23. std::cout << n << ' ';
    24. }
    25. std::cout << std::endl;
    26. return 0;
    27. }

    2. 访问元素

    `std::list` 不支持随机访问(即不支持 `operator[]`),但是可以使用迭代器遍历和访问元素:

    1. #include
    2. #include
    3. int main() {
    4. std::list<int> l = {1, 2, 3, 4, 5, 6};
    5. // 使用迭代器遍历
    6. for (auto it = l.begin(); it != l.end(); ++it) {
    7. std::cout << *it << ' ';
    8. }
    9. std::cout << std::endl;
    10. // 使用范围 for 循环遍历
    11. for (int n : l) {
    12. std::cout << n << ' ';
    13. }
    14. std::cout << std::endl;
    15. return 0;
    16. }

    3. 反向遍历

    1. #include
    2. #include
    3. int main() {
    4. std::list<int> l = {1, 2, 3, 4, 5, 6};
    5. // 反向遍历
    6. for (auto it = l.rbegin(); it != l.rend(); ++it) {
    7. std::cout << *it << ' ';
    8. }
    9. std::cout << std::endl;
    10. return 0;
    11. }

    4. 其它用法

    1. #include
    2. #include
    3. int main() {
    4. std::list<int> l = {1, 2, 3, 4, 5, 6};
    5. // 获取列表大小
    6. std::cout << "Size: " << l.size() << std::endl;
    7. // 检查是否为空
    8. if (l.empty()) {
    9. std::cout << "List is empty" << std::endl;
    10. } else {
    11. std::cout << "List is not empty" << std::endl;
    12. }
    13. // 清空列表
    14. l.clear();
    15. std::cout << "Size after clear: " << l.size() << std::endl;
    16. return 0;
    17. }

    进阶使用技巧

    1. 合并和排序

    1. #include
    2. #include
    3. int main() {
    4. std::list<int> l1 = {1, 3, 5, 7};
    5. std::list<int> l2 = {2, 4, 6, 8};
    6. // 合并两个已排序的列表
    7. l1.merge(l2);
    8. // 排序
    9. l1.sort();
    10. // 反转
    11. l1.reverse();
    12. // 输出列表 l1 的内容
    13. for (int n : l1) {
    14. std::cout << n << ' ';
    15. }
    16. std::cout << std::endl;
    17. return 0;
    18. }

    2. 去重

    1. #include
    2. #include
    3. int main() {
    4. std::list<int> l = {1, 2, 2, 3, 3, 3, 4, 5};
    5. // 必须先排序,然后去重
    6. l.sort();
    7. l.unique();
    8. // 输出去重后的列表 l 的内容
    9. for (int n : l) {
    10. std::cout << n << ' ';
    11. }
    12. std::cout << std::endl;
    13. return 0;
    14. }

    自定义比较函数

    在 `sort`、`merge` 等方法中,可以传递自定义比较函数:

    1. #include
    2. #include
    3. bool customCompare(int a, int b) {
    4. return a > b; // 降序排列
    5. }
    6. int main() {
    7. std::list<int> l = {1, 3, 2, 5, 4};
    8. // 使用自定义比较函数排序
    9. l.sort(customCompare);
    10. // 输出排序后的列表 l 的内容
    11. for (int n : l) {
    12. std::cout << n << ' ';
    13. }
    14. std::cout << std::endl;
    15. return 0;
    16. }

    总结

    `std::list` 是 C++ 标准库中功能强大且灵活的双向链表容器,适用于需要频繁插入和删除操作的场景。在我们实际开发中,根据项目的具体需求选择合适的容器,比如‘std::forward_list’等,可以显著提高代码性能和可维护性。

    引用

    std::list - cppreference.com

  • 相关阅读:
    【C语言】对文件的输入输出
    2023-09-21力扣每日一题
    Day45-SpringBoot仿牛客网社区开发01-项目介绍
    【java】【SSM框架系列】【二】SpringMVC
    道不可言说的一种应用
    Java八股文总结(二)
    【LeetCode】最长连续序列 [M](数据结构设计)
    睿趣科技:抖音小店多久可以做起来
    记录--基于Vue2.0实现后台系统权限控制
    java-php-python-ssm基于个人阅读习惯的个性化推荐系统研究计算机毕业设计
  • 原文地址:https://blog.csdn.net/GOLOJO/article/details/139372513