如果函数检查索引,则在这种情况下的一般方法是引发异常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