从索引越界的c++链表返回空值

returning a null value from an index out of bounds c++ linked list

本文关键字:链表 返回 空值 c++ 索引 越界      更新时间:2023-10-16

如果索引越界,我试图返回空值,或者只是停止函数继续。当我将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::mapstd::unordered_map。他们是如何补救的呢?

对于std::vectorstd::array,他们只是顺其自然,让未定义的行为做肮脏的工作,让你的生活悲惨(看,就像在现实生活中做坏事导致坏业力)。对于std::mapstd::unordered_map,如果在当前元素中没有找到这样的索引/键,则返回一个新元素。这是以当容器为const时禁用此类行为为代价的,至于为什么您将在下面看到。

那么,你是怎么做的?如果让我来决定,我会选择未定义行为。另一种选择是抛出异常,就像调用std::vector::at()(又名"安全"operator[])时一样。抛出异常解决方案不适用于std::(unordered_)map::operator[]const版本,因为它将与它的非抛出非const兄弟不一致。