我遇到过这样一种情况:set :: find不是找到对象的正确方法,因为我以不同的方式(通过std :: find_if)找到对象,而不是在集合中进行排序。我没有找到任何关于以这种方式查找元素的复杂信息。我认为它是线性的,因为迭代通过“无序”容器来找到匹配是线性的。
答案 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,它是单向的。唯一可以想到的实现是遍历每个元素并检查谓词。因为谓词是任意的,所以不可能将算法专门用于不同的容器类型,以提高算法的复杂性。