如果索引越界,我试图返回空值,或者只是停止函数继续。当我将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
兄弟不一致。