STL容器中 list(双向链表)的增删改查

list(双向链表)

std::list 是 C++ 标准模板库(STL)中的一个容器,它实现了一个双向链表。双向链表中的每个元素都包含三个部分:存储数据的元素本身、指向前一个元素的指针(或迭代器)、以及指向后一个元素的指针(或迭代器)。这使得在链表的任何位置进行插入和删除操作都非常高效,因为这些操作只需要改变指针的指向,而不需要移动其他元素。然而,与数组或 std::vector 相比,随机访问元素的速度较慢,因为访问元素需要从头或尾开始遍历链表。list支持快速的插入和删除操作,但不支持随机访问。

#include <iostream>  
#include <list>  
  
int main() {  
    std::list<int> lst;  
  
    // 向list中添加元素  
    lst.push_back(10);  
    lst.push_front(5);  
  
    // 遍历list  
    for (std::list<int>::iterator it = lst.begin(); it != lst.end(); ++it) {  
        std::cout << "元素: " << *it << std::endl;  
    }  
  
    // 使用范围for循环遍历list(需要C++11及以后,并包含<initializer_list>)  
    // 注意:直接的范围for循环不适用于std::list,但可以使用其他方式模拟  
  
    return 0;  
}  
  
// 注意:由于list不支持随机访问迭代器,因此不能直接使用范围for循环。  
// 可以通过C++11的auto和基于范围的for循环来遍历list,但通常需要额外的辅助,如std::begin和std::end。

插入元素

std::list 中插入元素可以使用 insert 方法。它可以在指定位置之前插入一个新元素,也可以插入一个元素范围。

#include <iostream>  
#include <list>  
  
int main() {  
    std::list<int> myList = {1, 2, 4};  
  
    // 在第二个元素之前插入3  
    auto it = myList.begin();  
    std::advance(it, 1); // 移动迭代器到第二个元素  
    myList.insert(it, 3);  
  
    // 遍历并打印  
    for (int elem : myList) {  
        std::cout << elem << " ";  
    }  
    std::cout << std::endl;  
  
    return 0;  
}

删除元素

删除元素可以使用 erase 方法,该方法删除迭代器指向的元素,并返回指向下一个元素的迭代器。

#include <iostream>  
#include <list>  
  
int main() {  
    std::list<int> myList = {1, 2, 3, 4};  
  
    // 删除值为3的元素  
    for (auto it = myList.begin(); it != myList.end(); ) {  
        if (*it == 3) {  
            it = myList.erase(it); // 注意,这里迭代器需要更新  
        } else {  
            ++it;  
        }  
    }  
  
    // 遍历并打印  
    for (int elem : myList) {  
        std::cout << elem << " ";  
    }  
    std::cout << std::endl;  
  
    return 0;  
}

修改元素

修改元素非常简单,直接通过迭代器访问并修改其值。

#include <iostream>  
#include <list>  
  
int main() {  
    std::list<int> myList = {1, 2, 3, 4};  
  
    // 修改第二个元素为10  
    auto it = myList.begin();  
    std::advance(it, 1); // 移动到第二个元素  
    *it = 10;  
  
    // 遍历并打印  
    for (int elem : myList) {  
        std::cout << elem << " ";  
    }  
    std::cout << std::endl;  
  
    return 0;  
}

遍历元素

遍历 std::list 可以使用范围基于的for循环(如上面示例所示),或者使用迭代器手动遍历。

#include <iostream>  
#include <list>  
  
int main() {  
    std::list<int> myList = {1, 2, 3, 4};  
  
    // 使用迭代器遍历  
    for (auto it = myList.begin(); it != myList.end(); ++it) {  
        std::cout << *it << " ";  
    }  
    std::cout << std::endl;  
  
    return 0;  
}
相关推荐
ChoSeitaku3 分钟前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
娅娅梨5 分钟前
C++ 错题本--not found for architecture x86_64 问题
开发语言·c++
兵哥工控10 分钟前
MFC工控项目实例二十九主对话框调用子对话框设定参数值
c++·mfc
我爱工作&工作love我17 分钟前
1435:【例题3】曲线 一本通 代替三分
c++·算法
娃娃丢没有坏心思1 小时前
C++20 概念与约束(2)—— 初识概念与约束
c语言·c++·现代c++
lexusv8ls600h1 小时前
探索 C++20:C++ 的新纪元
c++·c++20
lexusv8ls600h1 小时前
C++20 中最优雅的那个小特性 - Ranges
c++·c++20
白-胖-子1 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
workflower1 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归
好睡凯1 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法