std::map如何通过字符串查找元素? 在C++中,您可以创建一个带有STD::MAP.< /P>的映射容器。

std::map如何通过字符串查找元素? 在C++中,您可以创建一个带有STD::MAP.< /P>的映射容器。,c++,string,optimization,map,C++,String,Optimization,Map,在我的例子中,键是字符串,元素是整数。标准::地图 我想知道的是映射如何通过使用[]操作符检索其元素 用一根绳子 映射是否只是将输入的字符串与其所有现有的字符串键集与我声明的元素进行比较?如果是这样的话,那么如果我需要一种从一长串字符串中检索所需元素的最佳方法,那么它肯定会显得很慢 按字符串编制索引的更快方法是为字符串中的每个字符使用256个相同类型的链表。这意味着为了检索我的元素,我所要做的就是说[char 1]->[char 2]->…[char n]->element 在这里,速度将由字符

在我的例子中,键是字符串,元素是整数。标准::地图

我想知道的是映射如何通过使用[]操作符检索其元素 用一根绳子

映射是否只是将输入的字符串与其所有现有的字符串键集与我声明的元素进行比较?如果是这样的话,那么如果我需要一种从一长串字符串中检索所需元素的最佳方法,那么它肯定会显得很慢

按字符串编制索引的更快方法是为字符串中的每个字符使用256个相同类型的链表。这意味着为了检索我的元素,我所要做的就是说[char 1]->[char 2]->…[char n]->element

在这里,速度将由字符串的长度决定,或者,无论您指向下一个字符多少次

编辑:我刚才描述的这个过程称为a,它不是std::map使用的

如果std::map不使用此方法,那么它是如何工作的?如果我碰巧添加了大量的键,它值得使用吗

如果我的问题似乎不清楚,请告诉我,以便我可以更改它。我只需要知道映射中键的数量是否会减慢访问过程,以及映射如何匹配它们的元素。

std::map使用。因此,查找时间与logn成正比,其中n是映射中的元素数。所以不,它不慢

另一种将字符串映射到值的方法是一个二进制搜索树,这种方法通常比二进制搜索树更快,但并不总是如此。标准库也有一个这样的库,其形式为


你在建议书中所描述的内容与。标准库没有Trie类。请注意,虽然Trie适用于作为字符串的键的特定情况,但二元搜索树更为通用,只要求可以对键进行排序。map使用操作符执行此排序No,它不是将键与所有现有键进行比较

map使用一种称为二叉搜索树(通常是红黑树)的数据结构,在红黑树中查找元素非常有效

红黑树的工作原理过于宽泛,请先阅读。

我认为std::map是作为一种称为红黑树的二进制搜索树实现的。它的复杂性是logn

请参见此处了解更多详细信息:

正如其他人所说,std::map是作为一个排序的、平衡的二叉树实现的,它的查找时间非常复杂

这实际上意味着它可以进行二进制搜索:您要查找的内容是否恰好是中间元素,按排序顺序?伟大的但是如果它小于这个值,搜索较小元素的子树,如果它大于较大元素的子树。重复此操作,直到找到该元素,或者您意识到该元素根本不在树中。例如:

                        my_map: 37, left/less, right/greater
                                        /            \
                                      22             68
                                     /  \           /  \
                                    11   26        47  99
                                  /  |   | \     /  |   | \
                                 5  13  24  33  39 49  78 nullptr
在这里,无论你想找到哪个数字——你可以看到,你从比较37开始,然后如果它越小,你就检查根节点下的越小的子树,如果它越多,你就检查越大的子树:最坏的情况是,在你找到元素或意识到它不在树中之前,你最终与4个数字进行比较

为了给你一些关于这个的观点,如果你有1000个元素,那么最多需要10个比较,平均9个。这是因为log21000恰好是10-2^10实际上是1024。每次有大约1000倍的元素时,就会涉及到另外10个比较:即100万个元素=>~20个比较,10亿=>~30个,1万亿=>~40个

字符串的比较通常是相当快的,特别是如果字符串短于几十个字符,并且它们不只是在最后一个或三个字符中变化


你所建议的——trie——确实可以非常快——它们特别适用于像“键入时完成”这样的提示,即一次输入一个字符,并希望实时更新可能的匹配项。但是,它们确实在各处都有可能的字符大小的节点的单独数组-有时额外的内存使用和随之而来的缓存页错误可能会打破平衡,转而使用std::map或std::unordered_映射哈希表-实现每个节点并进行比较,如果您有评测证据证明您应该关心……

谢谢,这就是我需要听到的。恐怕我无法避免在没有大量反对票的情况下问一个问题。可能是因为我在std::map上找不到信息,或者是因为我在总体研究方面很差。我甚至不知道尝试是一件事。@ RADYNX:如果你没有一个C++语言标准的拷贝,那么大多数好的在线引用都会包含标准库容器和算法的复杂性。例如,请参见复杂性标签下的。