我应该使用哪个容器快速找到一个元素,知道通过构造它已经订购了?

时间:2016-01-16 18:52:48

标签: c++ vector find set containers

我必须使用一个已经订购的容器,我需要一个快速查找功能。

我的想法是使用一个集合来利用它的set.find,这应该足够快,但使用set.insert构建我的集可能会很慢,因为我已经知道元素是有序的!

对于这部分,我可以使用带有vector.push_back的向量,但是我应该自己编写查找函数,它也会比set::find慢... ...你建议我什么? ?

编辑:

  • 容器需要修改,但总是会被订购,其大小将始终相同(但我不知道它是先验的)
  • 没有重复的值。
  • 发现比插入更多。
  • 我只需要知道它是否存在,而不是它的位置。
  • 我找到了std :: binary_search。这样好吗?

2 个答案:

答案 0 :(得分:2)

如果输入范围已经排序,则保证从一对迭代器构造set为O(N),因此您可以使用它。 (参见例如http://en.cppreference.com/w/cpp/container/set/set。)

后续插入是O(log N)。

虽然如果总大小不是那么大,那么排序的vector往往会击败其他所有内容,因为它对缓存友好。 std::binary_search为O(log N),与set::find相同。

std::unordered_set并不关心你的订购,但确实给你O(1)查询(平均而言,没有保证)。

答案 1 :(得分:0)

<{> std::vector std::make_heap()push_heap()pop_heap()sort_heap()可以帮助您尽快处理std::set。但是,您需要手动使用std :: binary_search。