贝利信息

c++中如何使用list链表_c++ list容器插入与删除元素【汇总】

日期:2026-01-18 00:00 / 作者:裘德小鎮的故事
std::list插入需按场景选择:push_back/push_front用于头尾O(1)插入,insert依赖迭代器实现中间插入;删除用erase(按迭代器)或成员remove(按值);迭代器仅在所指节点被删时失效;实际中vector/deque常优于list。

list 插入元素:用 push_backpush_frontinsert 区分场景

插入不等于“随便塞”,std::list 是双向链表,push_backpush_front 是 O(1) 操作,适合在头尾追加;中间插入必须用 insert,但它依赖迭代器,不能用下标。

#include 
#include 
int main() {
    std::list lst = {1, 2, 3};
    lst.push_back(4);        // {1,2,3,4}
    lst.push_front(0);       // {0,1,2,3,4}
    auto it = std::next(lst.begin(), 2); // 指向 2
    lst.insert(it, 99);      // {0,1,99,2,3,4}
}

list 删除元素:避免用错 eraseremove

erase 是容器成员函数,按迭代器或范围删除,返回下一个有效迭代器;remove 是算法(也存在于 list 成员中),按值删除所有匹配项,不移动迭代器——但注意:标准库 std::remove

list 无效,必须用 lst.remove(x) 成员版。

std::list lst = {1, 2, 3, 2, 4, 2};
// ✅ 正确:成员 remove 删所有 2
lst.remove(2);  // {1,3,4}

// ✅ 正确:erase 遍历时接返回值
for (auto it = lst.begin(); it != lst.end(); ) {
    if (*it == 3) it = lst.erase(it);  // 返回下一个
    else ++it;
}

list 迭代器失效规则:只在被删节点上失效,其余全安全

这是 listvector 最关键区别:只要没删掉某个节点,指向它的迭代器就永远有效。插入、移动、排序都不让它失效。唯一失效场景就是该节点被 eraseremove 掉。

性能与替代建议:别为“链表”而链表

std::list 真正优势只有频繁首尾增删 + 迭代器长期持有 + 不需要缓存友好性。实际项目中,多数所谓“需要链表”的场景,std::vector 配合 erase-remove idiomstd::deque 更快且内存更紧凑。

真正难的不是记住怎么写 insert,而是判断此刻是否真该用 list。很多崩溃和慢,源于把 list 当成“万能动态结构”来用。