如果索引超出范围,我正在尝试返回空值,或者只是停止继续执行该功能。当我将T&
更改为T*
时,我可以返回空值,但之后我无法返回curr->数据。如果我使用T&
,它将不允许我使用null。任何返回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;
}
}
答案 0 :(得分:2)
是的,抛出out_of_range
例外。引用并不意味着支持“null”值...如果你想让这样的哨兵坚持指针。
答案 1 :(得分:1)
我认为你应该做出类似的条件 if(i&lt; 0 || i&gt; this-&gt; size-1) 因为当访问最后一个节点时,它应该将下一个指针变为空
答案 2 :(得分:0)
引用不可为空。如果参数无效(即超出界限),并且因此无法履行合同,那么正确的做法是抛出异常。
答案 3 :(得分:0)
这是一个问题&#34;面对一些标准库容器,特别是std::vector
,std::array
,std::map
和std::unordered_map
。他们如何解决这个问题?
对于std::vector
和std::array
,他们只是让它成为,让未定义的行为做肮脏的工作,让你的生活变得悲惨(看,就像在现实生活中做坏事导致坏业力) 。对于std::map
和std::unordered_map
,如果在当前元素中找不到这样的索引/键,则它们返回一个新元素。这是以容器为const
时禁用此类行为为代价的,以及您将在下面看到的原因。
那么,你做什么的?如果我决定,我会采取未定义的行为。另一种选择是抛出exception,就像调用std::vector::at()
(又名&#34; safe&#34; operator[]
)一样。抛出异常解决方案并不适用于const
版std::(unordered_)map::operator[]
,因为它与非投掷非const
兄弟不一致。