C++ 我应该使用哪个容器快速查找元素,通过构造它';已经订了吗?

C++ 我应该使用哪个容器快速查找元素,通过构造它';已经订了吗?,c++,vector,find,set,containers,C++,Vector,Find,Set,Containers,我必须使用一个已经订购的容器,我需要一个快速查找功能 我的想法是使用一个集合来利用它的集合。find,这应该足够快,但是用集合构建我的集合。insert可能会很慢,因为我已经知道元素是有序的 对于这一部分,我可以使用带有vector.push_back的向量,但是我应该自己编写find函数,它也会比set::find慢。。。你有什么建议吗 编辑: 该容器需要修改,但将始终被订购,其大小将始终相同(但我事先不知道) 没有重复的值 找到的比插入的多得多 我只想知道它是否存在,而不是它的位置 我找到

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

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

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

编辑:

  • 该容器需要修改,但将始终被订购,其大小将始终相同(但我事先不知道)
  • 没有重复的值
  • 找到的比插入的多得多
  • 我只想知道它是否存在,而不是它的位置
  • 我找到了std::binary\u搜索。好吗

如果输入范围已经排序,则从一对迭代器构造一个
保证为O(N),因此您可以使用它。(参见示例…)

随后的插入是O(logn)

虽然如果总大小不是那么大,但排序的
向量
往往优于其他所有向量,因为它对缓存非常友好
std::binary\u search
是O(logn),与
set::find
相同


std::unordered\u set
不关心您的排序,但会给您提供O(1)查找(平均而言,没有任何保证)。

std::vector
使用
std::make\u heap()
push\u heap()
pop\u heap()
sort\u heap()
可以帮助您尽快处理它。但是,您需要手动使用std::binary\u搜索

在向量上使用下界或上界函数(二进制搜索)。如果要修改,请使用set或map.I第二个SashaMNs建议。此外,您可能知道条目的数量,您可以通过使用“保留”创建具有适当容量的条目来避免不必要的大小调整。插入与查找的频率如何?@wewewe,您是说容器的大小将相同,但您似乎暗示初始化后也会有插入。什么意思?如果没有插入,那么我将使用std::array,如果有一些插入,那么使用std::set或std::unordered_set,如果有一个好的散列函数。std::binary_搜索在std::array上是最佳的。因为您获得恒定的访问时间,所以哈希表不会节拍集。OP似乎不想排序,没有提到按排序顺序对值进行迭代。@SelçukCihan Yes-请参阅编辑,其中我提到了
unordered_set