std :: map类的find()函数效率如何?它是否遍历查找密钥的所有元素,使其为O(n),或者是否在平衡树中,还是使用哈希函数或什么?
答案 0 :(得分:35)
Log(n)它基于一棵红黑树。
编辑:n当然是地图中的成员数量。
答案 1 :(得分:17)
std::map
和std::set
由编译器供应商使用高度平衡的二叉搜索树(例如红黑树,AVL树)实现。
正如大卫正确指出的那样,find
将花费O(log n)时间,其中n是容器中元素的数量。
但这与原始数据类型相似,如int
,long
,char
,double
等,而不是字符串。
如果将std:string
(比如大小'm')用作键,则遍历平衡二叉搜索树的高度将需要给定键的log n 比较进入树。
当std::string
是std::map
或std::set
的关键时,find
和insert
操作的费用为O(m log n),其中m为需要找到的给定字符串的长度。
答案 2 :(得分:3)
它不迭代所有元素,它进行二进制搜索(即O(log(n)))。它使用运算符<或比较器进行搜索。
如果你想要一个哈希映射,你可以使用std :: unordered_map(在C ++ - 0x上添加),它使用哈希函数并且平均(取决于你提供的哈希函数和数据)find()将是O(1)。