C++ 如何返回一个";空";迭代器的值?

C++ 如何返回一个";空";迭代器的值?,c++,iterator,C++,Iterator,我想写一个函数,它接受两个向量迭代器作为输入,然后根据一些条件返回其中任何一个迭代器。如果不满足任何条件,则需要返回类似于null的内容。由于不可能使用空迭代器,我应该使用什么 我们可以将容器作为参数之一传递给函数,然后将返回迭代器初始化为container.end()。传递容器只是为了初始化迭代器有意义吗 std::vector<UserDefinedObj>::iterator getNecessaryIterator(std::vector<UserDefinedObj&

我想写一个函数,它接受两个向量迭代器作为输入,然后根据一些条件返回其中任何一个迭代器。如果不满足任何条件,则需要返回类似于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;
}
std::vector::iterator getNecessaryIterator(std::vector::iterator f,std::vector::iterator s)
{
std::vector::iterator r=??;//如何在不添加任何函数参数的情况下进行初始化
如果(f->name==“Alex”)
{ 
r=f;
}
否则,如果(s->name==“Matt”)
{ 
r=s;
}
返回r;
}

我建议要么
std::end(向量)
要么将返回类型更改为
std::optional
。我更喜欢前者,因为感觉它与
中的现有功能相匹配,但这是经销商的选择。请注意,这两个选项都需要更改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::可选getNecessaryIterator(std::vector::iterator f,std::vector::iterator s)
{
如果(f->name==“Alex”)
{ 
返回f;
}
否则,如果(s->name==“Matt”)
{ 
返回s;
}
返回std::nullopt;
}

我建议要么
std::end(向量)
要么将返回类型更改为
std::optional
。我更喜欢前者,因为感觉它与
中的现有功能相匹配,但这是经销商的选择。请注意,这两个选项都需要更改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::可选getNecessaryIterator(std::vector::iterator f,std::vector::iterator s)
{
如果(f->name==“Alex”)
{ 
返回f;
}
否则,如果(s->name==“Matt”)
{ 
返回s;
}
返回std::nullopt;
}

方法不错,但std::optional符合c++17,我目前使用的是c++14。您能使用boost吗?有一个
boost::optional
在C++14中运行得很好。这个方法很好,但是std::optional是C++17兼容的,我目前正在使用C++14。你能使用boost吗?有一个
boost::optional
在C++14中运行得很好。是否可以将Unitized iterator与Specific Container.end()进行比较,以验证调用的函数中是否不满足任何条件?我相信,如果您尝试以任何方式使用未初始化的iterator,如果您有一个好的iterator实现,它将抛出异常。如果
f
s
位于容器的末尾,则问题中显示的代码将不起作用。如果两个迭代器
f
s
位于同一容器中,只需传递第三个参数,即该容器的结尾迭代器。如果不想返回其他两个迭代器中的任何一个,请返回该迭代器。(另外,在使用前检查
f
s
是否不是end迭代器)。@Peter我会投票支持这个答案。Unitized迭代器是否可以与Specific Container.end()进行比较要验证调用的函数是否不满足任何条件?我相信,如果您尝试以任何方式使用未初始化的迭代器,如果您有一个良好的迭代器实现,则会引发异常。如果
f
s
位于容器的末尾,则问题中显示的代码将不起作用。如果两个迭代器
f
s
位于同一容器中,只需传递第三个参数,即该容器的结尾迭代器。如果不想返回其他两个迭代器中的任何一个,请返回该迭代器。(另外,在使用前检查
f
s
是否不是结束迭代器)。@Peter我会投票支持这个答案。