find_if是否设置为线性?

时间:2016-11-13 18:54:59

标签: c++ algorithm search set time-complexity

我遇到过这样一种情况:set :: find不是找到对象的正确方法,因为我以不同的方式(通过std :: find_if)找到对象,而不是在集合中进行排序。我没有找到任何关于以这种方式查找元素的复杂信息。我认为它是线性的,因为迭代通过“无序”容器来找到匹配是线性的。

3 个答案:

答案 0 :(得分:3)

是的,线性的。

从此ref

  

<强>复杂性

     

在第一个和最后一个之间的距离中最多线性:为每个元素调用pred,直到找到匹配为止。

原型是:

template<class InputIterator, class UnaryPredicate>
   InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred)

来自另一个ref

  

<强>复杂性

     

最多 - 谓词的最后一次应用

答案 1 :(得分:2)

您可以查看here,看看 find_if 的复杂性是线性的。

这是因为 find_if 是一种通用算法,它不知道它使用的某种类型的容器。因此,它不能使用不同容器的特性来增强搜索过程,只需检查所有元素即可找到合适的元素。

答案 2 :(得分:1)

是的,复杂性是线性的。

iterator参数是一个InputIterator,它是单向的。唯一可以想到的实现是遍历每个元素并检查谓词。因为谓词是任意的,所以不可能将算法专门用于不同的容器类型,以提高算法的复杂性。