如何在C ++中返回Null作为参考?

我做了一些最少的代码

vector<int> items = {1,2,5,7};
int& getatSafe(unsigned n) {
    if (n < items.size() && items[n] != 5) return items[n];
    else // ???
}

但是当我们找不到所需的项目时,如何返回null呢?
PS 。原始任务是搜索属性等于的项目。

  

不接受异常变体。我不需要暂停程序。
  例如,用户输入索引,并且每次输入错误时,用户都会得到“输入错误”

yndllhm 回答:如何在C ++中返回Null作为参考?

如果函数检查索引,则在这种情况下的一般方法是引发异常std::out_of_range.

要考虑到类模板at中已经存在成员函数std::vector

如果您不能使用异常并且任务为

  

P.S。原始任务是搜索属性等于的项目。

然后,您可以使用返回迭代器的标准算法std::find_if,也可以编写自己的函数以返回与搜索到的元素对应的索引。如果没有这样的元素,则返回向量的大小,例如

#include <iostream>
#include <vector>

template <typename Predicate>
std::vector<int>::size_type find_if( const std::vector<int> &v,Predicate predicate )
{
    std::vector<int>::size_type i = 0;

    while ( i != v.size() && !predicate( v[i] ) ) ++i;

    return i;
}

int main() 
{
    std::vector<int> items = {1,2,5,7};

    auto i = ::find_if( items,[]( const auto &item ) { return item % 2 == 0; } );

    if ( i != items.size() ) std::cout << items[i] << '\n';

    return 0;
}
,

C ++具有值语义。有nullptr个,但没有空值。引用始终引用某些内容。太好了,不能引用null。

您有几个选择:

  • 引发异常。您拒绝它们的论据没有根据。 std::vector::at确实做到了这一点(但我想您的代码只是更一般情况下的示例)
  • 返回一个可以为nullptr的指针(不建议使用,因为这样您就可以在调用方上正确处理指针了)
  • 返回std::optional。再次,这迫使调用者处理“没有返回值”的情况,但是与返回nullptr相比,调用者获得了一个精心设计的接口,很难使用错误。
  • 返回一个迭代器。 end通常用于在整个标准库中发出“未找到元素”的信号,因此,如果这样做的话也就不足为奇了。
  • 也许这不仅仅是针对不同情况的示例,那么您应该使用std::vector::at而不是手写函数来完成它。
  

PS 。原始任务是搜索属性等于的项目。

您应使用std::find在容器中查找项目。找不到元素时,它将返回容器的end

,

在不更改原型的情况下,您只能抛出异常。

如果可以更改原型,则可以:

  • 返回一个指针(并使用nullptr作为标记)
  • 返回一个迭代器(并使用items.end()作为标记)
  • 返回一个std::optional<std::reference_wrapper<int>>(并使用没有值的标记,那么您需要C ++ 17或boost)。
,

在C ++中引用的一种使用情况是确保没有空指针。因此,根据定义,不可能返回null作为参考。

但是,可以考虑不同的策略:

  • 返回迭代器:使用std::end(items)作为空值
  • 按价值回报
  • 如果没有有效的元素,则引发异常
本文链接:https://www.f2er.com/3075276.html

大家都在问