如何为迭代器返回“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() 进行比较,以验证调用函数中不满足任何条件? 我相信如果你尝试以任何方式使用未初始化的迭代器,如果你有一个好的迭代器实现,它会抛出异常。如果fs 顺便说一句位于其容器的末尾,则您在问题中显示的代码将不起作用。 如果两个迭代器 fs 在同一个容器中,只需传递第三个参数,即该容器的结束迭代器。如果您不想返回其他两个中的任何一个,请返回该迭代器。 (另外,在使用之前检查fs 不是结束迭代器)。 @Peter 我会投票赞成这个答案。 【参考方案1】:

我建议std::end(the_vector) 或将返回类型更改为std::optional&lt;std::vector&lt;UserDefinedObj&gt;::iterator&gt;。我更喜欢前者,因为它感觉它与&lt;algorithm&gt; 中的现有功能相匹配,但这是经销商的选择。请注意,这两个选项都需要更改 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”值?的主要内容,如果未能解决你的问题,请参考以下文章

如何为一长串整数创建优化的迭代器?

如何为特征矩阵创建 STL 输出迭代器?

如何为特征矩阵创建STL输出迭代器?

python之迭代器

如何在二叉树中返回迭代遍历的迭代器?

Python基础之迭代器