You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重载[]或=运算符实现类似vector的链表数据修改操作

实现方案

要实现list[0] = 2这种类似vector的操作效果,核心不需要单独给LinkedList类重载=运算符,重点是重载[]运算符返回节点存储值的非常量左值引用,赋值操作会直接作用在返回的引用上,调用元素类型本身的赋值运算符即可完成修改。


核心实现逻辑

#include <stdexcept>

// 链表节点定义,示例存储int类型值
struct Node {
    int val;
    Node* next;
    Node(int v) : val(v), next(nullptr) {}
};

class LinkedList {
private:
    Node* head = nullptr;
    int list_size = 0;
public:
    // 此处省略链表原有构造、插入、删除、析构等基础接口实现

    // 非常量版本[]运算符:用于修改元素,返回值的引用支持赋值
    int& operator[](int index) {
        // 下标合法性校验,避免越界访问
        if (index < 0 || index >= list_size) {
            throw std::out_of_range("链表下标超出有效范围");
        }
        // 链表不支持随机访问,需要遍历到对应下标位置
        Node* curr = head;
        for (int i = 0; i < index; i++) {
            curr = curr->next;
        }
        return curr->val;
    }

    // 配套常量版本[]运算符:用于常量链表对象读取元素,保证const对象也能使用[]
    const int& operator[](int index) const {
        if (index < 0 || index >= list_size) {
            throw std::out_of_range("链表下标超出有效范围");
        }
        Node* curr = head;
        for (int i = 0; i < index; i++) {
            curr = curr->next;
        }
        return curr->val;
    }
};

用法示例

int main() {
    LinkedList list;
    // 此处省略给链表插入元素的步骤,保证下标0对应有效节点
    list[0] = 2; // 直接修改下标0位置的存储值,和vector用法完全一致
    return 0;
}

注意事项

  • 链表的[]运算符时间复杂度为O(n),和vector的O(1)随机访问性能差距很大,大量下标访问场景不推荐用链表实现
  • 如果链表存储的是自定义类型,只要[]返回该类型的引用,无需额外重载赋值运算符即可正常工作
  • 必须做下标越界校验,避免访问野指针、空指针引发崩溃

内容的提问来源于stack exchange,提问作者Unlucko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:24:04