c++ - STL 中的 find() 与 binary_search()

标签 c++ stl binary-search

在 vector find()binary_search() 中搜索元素时,哪个函数更有效?

最佳答案

简单的答案是:std::find 用于未排序的数据,std::binary_search 用于排序的数据。但我认为这还不止于此:

这两种方法都采用包含 n 元素的范围 [start, end) 和将作为输入找到的值 x。但请注意 std::binary_search 仅返回一个 bool 的重要区别,它告诉您该范围是否包含该元素。 std::find() 返回一个迭代器。所以两者都有不同但重叠的用例。


std::find()很简单。 O(n) 迭代器递增和 O(n) 比较。输入数据是否排序也无关紧要。


对于 std::binary_search()您需要考虑多个因素:

  • 它只适用于排序的数据。您需要考虑分类成本。

  • 比较次数总是O(log n)

  • 如果迭代器不满足LegacyRandomAccessIterator迭代器增量的数量是O(n),当它们满足这个要求时它将是对数的。


结论(有点自以为是):

  • 当您对未排序的数据进行操作或需要您搜索的项目的位置时,您必须使用std::find()
  • 当您的数据已经排序或仍然需要排序时,您只是想检查某个元素是否存在,请使用 std::binary_search()
  • 如果您想搜索像 std::setstd::map 或它们的无序对应物这样的容器,也可以考虑它们的内置方法,例如 std::set::find

关于c++ - STL 中的 find() 与 binary_search(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68220759/

相关文章:

STL 容器上的 C++ 模板函数

c++ - 需要帮助将 regex_replace 与 wstring 一起使用

python - 我想进行二进制搜索,但结果有误

java - 如果将 NxM 乘法表按顺序排列,中间的数字是什么?

c++ - 我可以指望任何 STL 容器的 sizeof(string) 或 sizeof 吗?

c++ - 如何以优雅高效的方式将无符号/有符号整数/长整型转换为 C 字符串?

c++ - 卡在 api getdrivetype

c++ - 运行程序时它让我在名称后输入两行?请帮助

algorithm - 在 O(logN) 时间复杂度中使用 HashMap 对节点链表进行二进制搜索

c++ - 如何在 C++ 中安全地比较 32 位整数与 64 位整数以及如何在内部比较有符号整数?