C++ std::find的优点

C++ std::find的优点,c++,c++11,stl,find,containers,C++,C++11,Stl,Find,Containers,使用C++11的std::find比容器的find方法有什么优势吗 在std::vector(没有find方法)的情况下,std::find是否使用了一些智能算法或简单迭代每个元素的简单方法 在std::map的情况下,似乎需要传递std::pair,这是std::map的值类型。这看起来并不像您通常希望为键或映射元素查找的那样非常有用 其他容器,如std::list或std::set或std::unordered\u set,如何处理 在std::vector(没有find方法)的情况下,

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

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

  • std::map
    的情况下,似乎需要传递
    std::pair
    ,这是
    std::map
    值类型。这看起来并不像您通常希望为键或映射元素查找的那样非常有用

  • 其他容器,如
    std::list
    std::set
    std::unordered\u set
    ,如何处理

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

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

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

在std::map的情况下,似乎需要传递std::pair,这是std::map的值类型。这看起来并不像您通常希望为键或映射元素查找的那样非常有用


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

通常,当容器公开与泛型算法同名的成员函数时,这是因为成员函数执行相同的操作,但提供了更好的复杂性保证

其他容器如std::list、std::set或std::unordered\u set呢

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


对于
std::set
std::unordered\u set
,您应该使用
find()
成员函数,这保证了更高的复杂性(分别为O(logn)和平均O(1)。

您可以在
std::map
上使用
std::find\u if
,以便仅比较键。但是在这种情况下,出于性能考虑,最好使用
find
member函数。但是,如果出于某种原因,您希望按值搜索映射,那么在这种情况下可以使用
find_if
。如果存在成员函数,则使用该函数;如果不存在,则使用
std::find
。如果您知道std::vector实际已排序,则始终可以使用std::lower_bound()进行二进制搜索。因此,字符串的find()操作复杂度是多少?“实际上,这里应该使用find()成员函数”