如何为迭代器返回“null”值?
Posted
技术标签:
【中文标题】如何为迭代器返回“null”值?【英文标题】:How to return a "null" value for an iterator? 【发布时间】:2019-09-14 14:04:34 【问题描述】:我想编写一个函数,它将两个向量迭代器作为输入,然后根据某些条件返回其中一个迭代器。如果不满足任何条件,则需要返回类似于 null 的内容。由于不可能使用空迭代器,我应该使用什么?
我们可以将容器作为参数之一传递给函数,然后将返回迭代器初始化为container.end()
。传递容器只是为了初始化迭代器有意义吗?
std::vector<UserDefinedObj>::iterator getNecessaryIterator(std::vector<UserDefinedObj>::iterator f,std::vector<UserDefinedObj>::iterator s)
std::vector<UserDefinedObj>::iterator r = ??; // How to initialize without adding any more function argument
if(f->name == "Alex")
r = f;
else if(s->name == "Matt")
r = s;
return r;
【问题讨论】:
是否可以将 Unitialized 迭代器与 specificContainer.end() 进行比较,以验证调用函数中不满足任何条件? 我相信如果你尝试以任何方式使用未初始化的迭代器,如果你有一个好的迭代器实现,它会抛出异常。如果f
或s
顺便说一句位于其容器的末尾,则您在问题中显示的代码将不起作用。
如果两个迭代器 f
和 s
在同一个容器中,只需传递第三个参数,即该容器的结束迭代器。如果您不想返回其他两个中的任何一个,请返回该迭代器。 (另外,在使用之前检查f
和s
不是结束迭代器)。
@Peter 我会投票赞成这个答案。
【参考方案1】:
我建议std::end(the_vector)
或将返回类型更改为std::optional<std::vector<UserDefinedObj>::iterator>
。我更喜欢前者,因为它感觉它与<algorithm>
中的现有功能相匹配,但这是经销商的选择。请注意,这两个选项都需要更改 API,以更改不同的返回类型或添加额外的参数;返回类型更改可能更容易进行。
使用std::optional
的未经测试的示例代码:
std::optional<std::vector<UserDefinedObj>::iterator> getNecessaryIterator(std::vector<UserDefinedObj>::iterator f,std::vector<UserDefinedObj>::iterator s)
if(f->name == "Alex")
return f;
else if(s->name == "Matt")
return s;
return std::nullopt;
【讨论】:
不错的方法,但 std::optional 是 c++17 兼容的,我目前正在使用 c++14 你可以使用boost吗?boost::optional
在 C++14 中运行良好。以上是关于如何为迭代器返回“null”值?的主要内容,如果未能解决你的问题,请参考以下文章