C++之【list详解篇一】如何玩好链表

前言:通过学习顺序表的玩法,我们已经知道关于迭代器遍历,及迭代器失效,那我们在C++中链表是如何玩的呢?


list

list中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已达到可扩展的能力。以下为list中一些常见的重要接口。
list的构造

|list中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已达到可扩展的能力。以下为list中一些常见的重要接口。

构造函数( (constructor)) 接口说明
list (size_type n, const value_type& val =value_type()) 构造的list中包含n个值为val的元素
list() 构造空的list
list (const list& x) 拷贝构造函数
list (InputIterator first, InputIterator last) 用[first, last)区间中的元素构造list

list构造代码演示

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

int main() {
    // 1. 默认构造:构造空的 list
    std::list<int> l1;
    std::cout << "l1 size: " << l1.size() << "\n"; // 输出 0

    // 2. 用 n 个相同值构造:包含 5 个值为 42 的元素
    std::list<int> l2(5, 42);
    std::cout << "l2 elements: ";
    for (int x : l2) std::cout << x << " "; // 输出 42 42 42 42 42
    std::cout << "\n";

    // 3. 拷贝构造:从 l2 拷贝构造 l3
    std::list<int> l3(l2);
    std::cout << "l3 elements: ";
    for (int x : l3) std::cout << x << " "; // 输出 42 42 42 42 42
    std::cout << "\n";

    // 4. 用迭代器区间构造:从 vector 的区间 [begin+1, end-1) 构造 list
    std::vector<int> vec = {10, 20, 30, 40, 50};
    std::list<int> l4(vec.begin() + 1, vec.end() - 1);
    std::cout << "l4 elements: ";
    for (int x : l4) std::cout << x << " "; // 输出 20 30 40
    std::cout << "\n";

    return 0;
}

list iterator的使用

此处,大家可暂时将迭代器理解成一个指针,该指针指向list中的某个节点。其实迭代器也分为好几种,分别是随机迭代器、双向迭代器,单向迭代器等。那他们的功能是什么呢?

如下图:

迭代器类型 核心能力 典型适用容器
输入迭代器 (Input) 只读、单向(只能 ++)、只能遍历一次(读完就失效) istream_iterator
输出迭代器 (Output) 只写、单向(只能 ++)、只能遍历一次(写完就失效) ostream_iterator、inserter
前向迭代器 (Forward) 可读可写、单向(只能 ++)、可重复遍历(多次访问同一元素) forward_list、unordered 容器
双向迭代器 (Bidirectional) 可读可写、双向(++/--)、可重复遍历 list、set、map
随机访问迭代器 (Random Access) 可读可写、双向、支持随机跳转(+/-/[]/ 比较距离) vector、deque、array、string

list迭代器接口

函数声明 接口说明
begin()+end() 返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器
rbegin+ rend 返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的reverse_iterator,即begin位置
cpp 复制代码
#include <iostream>
#include <list>

int main() {
    std::list<int> mylist = {10, 20, 30, 40, 50};

    // 1. 正向遍历:使用 begin() 和 end()
    std::cout << "正向遍历: ";
    for (auto it = mylist.begin(); it != mylist.end(); ++it) {
        std::cout << *it << " "; // 输出: 10 20 30 40 50
    }
    std::cout << "\n";

    // 2. 反向遍历:使用 rbegin() 和 rend()
    std::cout << "反向遍历: ";
    for (auto it = mylist.rbegin(); it != mylist.rend(); ++it) {
        std::cout << *it << " "; // 输出: 50 40 30 20 10
    }
    std::cout << "\n";

    // 3. 演示反向迭代器的 ++ 行为
    auto r_it = mylist.rbegin(); // 指向 50 (最后一个元素)
    std::cout << "rbegin() 指向: " << *r_it << "\n"; // 50

    ++r_it; // ++ 操作让迭代器向前移动,指向 40
    std::cout << "++r_it 指向: " << *r_it << "\n"; // 40

    return 0;
}
  1. begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动
  2. rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动
相关推荐
汉克老师3 小时前
GESP6级C++考试语法知识(四、图与树(四))
c++·贪心算法·优先队列·哈夫曼编码·哈夫曼树·gesp6级·gesp六级
子兮曰4 小时前
whisper.cpp 深度解析:从边缘设备到实时语音识别
前端·c++·后端
特种加菲猫4 小时前
二叉搜索树:数据世界的“快速寻路指南”
开发语言·c++
naturerun4 小时前
从数组中删除元素的算法
数据结构·c++·算法
特种加菲猫4 小时前
STL关联容器:Set/Multiset与Map/Multimap详解
开发语言·c++
Andy4 小时前
C++ list容器基本逻辑结构详解
c++·windows·list
想唱rap6 小时前
传输层协议TCP
linux·运维·服务器·网络·c++·tcp/ip
瑶池酒剑仙6 小时前
C++类和对象完全指南:从封装继承多态到内存布局的面向对象宝典(雨夜论道)
c语言·开发语言·c++·visual studio
潇湘散客7 小时前
CAX软件插件化设计实现牛刀小试
c++·算法·图形学·opengl
Ricky_Theseus7 小时前
const 和 #define 的区别
c++