从索引中返回一个空值c ++链接列表

时间:2014-08-13 05:51:42

标签: c++ linked-list

如果索引超出范围,我正在尝试返回空值,或者只是停止继续执行该功能。当我将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;
   }
 }

4 个答案:

答案 0 :(得分:2)

是的,抛出out_of_range例外。引用并不意味着支持“null”值...如果你想让这样的哨兵坚持指针。

答案 1 :(得分:1)

我认为你应该做出类似的条件 if(i&lt; 0 || i&gt; this-&gt; size-1) 因为当访问最后一个节点时,它应该将下一个指针变为空

答案 2 :(得分:0)

引用不可为空。如果参数无效(即超出界限),并且因此无法履行合同,那么正确的做法是抛出异常。

答案 3 :(得分:0)

这是一个问题&#34;面对一些标准库容器,特别是std::vectorstd::arraystd::mapstd::unordered_map。他们如何解决这个问题?

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

那么,你做什么的?如果我决定,我会采取未定义的行为。另一种选择是抛出exception,就像调用std::vector::at()(又名&#34; safe&#34; operator[])一样。抛出异常解决方案并不适用于conststd::(unordered_)map::operator[],因为它与非投掷非const兄弟不一致。