优雅检查std :: find“not found”条件

时间:2014-05-24 17:56:49

标签: c++

我使用最常用的方法在小列表中搜索某个特定对象:

iterator=std::find(begin, end, whatToFind);

如果std :: find没有找到该元素,它将在容器的末尾返回迭代器,所以最常见的建议在SO方式上:

if (iterator != end) {
    found 
} else {
    not found
}

但如果我要找的元素到底是什么呢?或者它可能是一个列表,仅包含我正在寻找的元素?我真的需要手动检查这些条件还是有某种标志(我不知道),这肯定标志着not_found案例? 谢谢。

3 个答案:

答案 0 :(得分:4)

如果搜索项位于列表(容器)的末尾,则迭代器不引用end()。迭代器end()是一个保留(占位符)迭代器,是你最后一个项目之后的下一个迭代器。但是它并不适用于begin(),它实际上是指容器内的第一个项目。一般来说,C ++范围的形式为[begin,end]。

enter image description here

  

返回元素的最后一个元素后面的元素的迭代器   容器。该元素充当占位符;试图访问它   导致未定义的行为。

答案 1 :(得分:3)

  

但是如果我要找的元素到底是什么呢?

不可能。结束(即end()返回的迭代器)不指向有效元素。容器中的最后一个元素(如果元素数多于零)是迭代器 end()之前指向的元素。

  

或许这是一个列表,只包含我要找的元素?

然后find将不会返回end。它将返回begin。在这种情况下,直接在end之前。

答案 2 :(得分:3)

end()未指向有效元素(它指向最后一个元素之后的一个元素)。因此没有歧义。