Merits of std::find

Merits of std::find

本文关键字:find std of Merits      更新时间:2023-10-16

与容器的find方法相比,使用C++11的std::find有什么优势吗?

  • std::vector(没有find方法)的情况下,std::find是否使用了一些智能算法或简单地迭代每个元素的天真方法?

  • std::map的情况下,似乎需要传递一个std::pair,它是std::mapvalue_type。这似乎不是很有用,因为您通常希望为键或映射元素找到它。

  • 其他容器如std::liststd::setstd::unordered_set呢?

在std::vector(没有find方法)的情况下,std::find是否使用了一些聪明的算法或简单地迭代每个元素的天真方法?

它不能,因为矢量没有排序。除了具有O(n)复杂度的线性搜索之外,没有其他方法可以在未排序的向量中找到元素。

另一方面,序列容器不提供find()成员函数,因此您不可能使用它。

在std::map的情况下,似乎需要传递一个std::pair,它是std::map的value_type。这似乎不是很有用,因为您通常希望为键或映射元素找到它。

实际上,这里应该使用find()成员函数,它保证了更好的复杂性(O(logN))。

通常,当容器公开与泛型算法同名的成员函数时,这是因为成员函数做同样的事情,但提供了更好的复杂性保证。

其他容器(如std::list、std::set或std::unordered_set)呢?

就像std::vector一样,std::list不是一个已排序的容器,所以同样的结论也适用。

对于std::setstd::unordered_set,您应该使用find()成员函数,它可以保证更好的复杂性(分别为O(logn)和平均值O(1))。