C++ 一个boost或stl api,用于以string=>;的形式对字符串数组进行散列;数组索引

C++ 一个boost或stl api,用于以string=>;的形式对字符串数组进行散列;数组索引,c++,boost,stl,C++,Boost,Stl,我正在寻找一个类似于此的增强或stl API: 简而言之,为了提高查找性能,它从字符串(char*)数组创建一个映射(hash),其中键是数组索引 我知道它很容易在其他API之上实现。首先,您是否测试过当前的实现速度特别慢?在尝试优化之前,您应该始终进行基准测试 不管怎样,这似乎正是你想要的。然后,您只需用一个boost::bimap替换该数组,并动态生成您自己的索引。给定一个const char*数组,如nsStaticCaseInsensitiveNameTable::Init函数所接受的

我正在寻找一个类似于此的增强或stl API:

简而言之,为了提高查找性能,它从字符串(char*)数组创建一个映射(hash),其中键是数组索引


我知道它很容易在其他API之上实现。

首先,您是否测试过当前的实现速度特别慢?在尝试优化之前,您应该始终进行基准测试


不管怎样,这似乎正是你想要的。然后,您只需用一个
boost::bimap
替换该数组,并动态生成您自己的索引。

给定一个
const char*
数组,如
nsStaticCaseInsensitiveNameTable::Init
函数所接受的
std::unordered\u map

std::无序映射字符串到索引;
对于(int i=0;i
不幸的是,默认哈希函数-
std::hash()
-将具有
const char*
地址,而不是指向ASCIIZ的文本数据,因此您必须编写自己的或复制一个。有一个叫做“
my_equal_to
”的问题被编辑到


这里唯一的区别是,
std::unordered_map
与“
Lookup
”的等价物(如果知道字符串会出现在某个地方,可以使用
操作符[]
,否则最好使用
find
)不区分大小写,因此需要调用
来查找()
如果您不确定键的大小写是否已为小写,则键上的字符串处理函数。(请注意,根据
nsStaticCastInsensitiveNameTable
标题的文档,要求存储的字符串必须是小写的,这是使用的前提条件)。如果必须调用某种方式的
to_lower()
函数让您感到困扰,您可以在自己的类中将
无序映射
打包,在转发到搜索函数之前调用
to_lower()

您可以更具体地说明您的问题是什么吗?是散列算法吗?使用什么数据结构?还有别的吗?你知道标准中哪个是散列容器吗?使用一些c宏魔法,我将枚举映射到两个方向的stings,这样我就可以得到string_a的“string a”,反之亦然。Mozilla的链接API是实现这一点的非常简单的方法(同样,使用一些c宏)。请从提供的链接复制相关信息。链接不会永远存在,它会让你的问题变得更加清晰,而不需要其他用户的进一步努力。这对于评论来说太长了。基本上,您有一个接受字符串(char*)数组的构造函数和一个接受字符串并返回数组中相等字符串(不区分大小写,顺便说一句,但这并不重要)索引的查找函数。它类似于一个映射,但是值是隐含的而不是指定的——也就是说,它们只是数组索引。“它从字符串(char*)数组中创建一个映射(hash),其中键是数组索引”是不准确的。。。映射中的键是字符串本身,值是原始数组索引。位图看起来确实很有前景。我会调查的。谢谢。没有“当前实施”。我过去经常使用Mozilla的API,但由于最近Gecko版本中的链接更改,我不得不放弃它。我忘了提到所有对都是在编译时已知的。如果所有对都是在编译时已知的,那么您当然不需要hashfunction。只需按字母顺序存储字符串,并使用二分法查找索引。起初我在描述我的问题时做得很差,因此,根据您关于使用位图的建议,我发现这里的答案很有用:谢谢。这正是我所说的“易于在其他API之上实现”的意思。我想确保我没有复制现有的API。然而,由于我的用例基本上是一个双向枚举字符串映射,因此在前面的答案中建议的boost位图似乎比无序映射和c宏的组合更适合我的用例。再次感谢。@user3326824:这个答案解释了
unordered\u map
的现有API可以直接使用,而无需在其上“实现”任何东西,就可以获得
nsstaticcaseinsensitividentable
sans case insensitivity的功能,您还没有说明是否关心它。这就是说,您确实需要“附带”一个适当的哈希函数,如果您根本不想让客户机将其使用适应不同的API,那么您可能仍然希望在它周围包装一个适配器,但显然您不希望在boost中找到一个等价的或具有相同API的标准。。。。(通过保留原始的
aNames
变量,从索引到ASCIIZ字符串的映射非常容易实现)。另外,C宏与此有什么关系呢?看看其中的技巧(宏的多个定义)文件,你会得到它。我链接到一个旧的未触及的分支,所以链接不会中断:@ USSR2626824:当然…老把戏。用C++,枚举值和标识符可以被记录下来而没有笨拙的包含黑客攻击,但是这是另一个问题和另一天……
std::unordered_map<const char*, int, my_equal_to<const char*>> string_to_index;
for (int i = 0; i < count; ++i)
    string_to_index[aNames[i]] = i;