如何重载[]或=运算符实现类似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
相关产品推荐
相关产品推荐

