从索引越界的c++链表返回空值
returning a null value from an index out of bounds c++ linked list
如果索引越界,我试图返回空值,或者只是停止函数继续。当我将T&
更改为T*
时,我可以返回空值,但在结束时我不能返回current ->数据。如果我使用T&
,它不允许我使用null。任何关于返回空值并停止函数执行的建议。我应该抛出一个Index Out of Bounds
异常吗?
T& operator [](int i) {
if(i < 0 || i > this->size){
std::cout << "Index out of bounds" << endl;
}
else{
Node* curr = this->head;
for(int j = 0; j < i; j++){
curr = curr->next;
j++;
}
return curr->data;
}
}
是,抛出out_of_range
异常。引用并不意味着支持"null"值…如果您想要这样的哨兵,请坚持使用指针。
我认为你应该做这样的条件如果我& lt;0 || I> this->size-1)因为当访问最后一个节点时下一个指针应该是null
引用不可为空。如果参数无效(即越界),因此您无法履行契约,正确的做法是抛出异常。
这是一些标准库容器面临的一个"问题",特别是std::vector
, std::array
, std::map
和std::unordered_map
。他们是如何补救的呢?
对于std::vector
和std::array
,他们只是顺其自然,让未定义的行为做肮脏的工作,让你的生活悲惨(看,就像在现实生活中做坏事导致坏业力)。对于std::map
和std::unordered_map
,如果在当前元素中没有找到这样的索引/键,则返回一个新元素。这是以当容器为const
时禁用此类行为为代价的,至于为什么您将在下面看到。
那么,你是怎么做的?如果让我来决定,我会选择未定义行为。另一种选择是抛出异常,就像调用std::vector::at()
(又名"安全"operator[]
)时一样。抛出异常解决方案不适用于std::(unordered_)map::operator[]
的const
版本,因为它将与它的非抛出非const
兄弟不一致。
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- 无法创建或返回反向链表
- 为什么将函数的返回类型从结构节点*更改为void后,链表的元素没有显示create_ll和显示?
- C++链表删除和删除返回功能
- 快速搜索链表未编译,需要返回语句
- 基于范围的 for 循环,用于包含C++中的指针的自定义链表,仅返回对象
- 如何在链表前面添加和返回节点
- 如何在没有参数的情况下实现返回双向链表大小的函数?int size() const.
- 为什么下面的使用链表实现线性队列的代码返回垃圾值然后崩溃
- 打印链表返回随机符号
- 返回指向循环链表某个点的指针
- (C++)如何创建一个函数来接收两个排序的链表并返回出现在两个列表中的第三个元素列表
- 返回组件时出现链表分段故障
- 从链表返回某些内容
- 返回链表中值的总和
- 创建一个函数,返回c++中链表的值
- 用户定义的链表从函数返回指针
- C++ 从链表中返回单个值
- 从函数返回变量的链表
- 从索引越界的c++链表返回空值