0

基本上,我需要找到一个单词的所有匹配字谜。我正在做的是使用一个大小为 26 的数组来表示一个单词中的字母。前任:

abcdefg={1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
aaaaaaa={7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}

这就是我创建数组的方式。

//stringtemp is a C++ string representing the word.
//letters is a size 26 int array representing all the letters in the string.
for(int i=0;i<stringtemp.length();i++)
{
    letters[stringtemp[i]-65]+=1;
}

这就是我将数组存储在地图中的方式。

dictionary[letters].push_back(stringtemp);

那么,我做错了什么还是在 C++ 中这是不可能的。在我找到的所有其他答案中,他们建议使用向量作为键,但这在我的情况下不起作用(我认为。)

4

3 回答 3

9

所有std::array<T, 26>,std::stringstd::vector<T>都是 a 完全有效的键类型std::map,因为它们都定义了小于比较运算符。请注意,std::array<T, 26>它类似于std::tuple<T, T, ..., T>,并且比较是按字典顺序定义的,与字符串比较非常相似。

#include <array>
#include <map>

typedef std::array<unsigned int, 26> alphabet;

std::map<alphabet, std::string> dictionary;

dictionary[{{1, 0, ..., 8}}] = "hello";

通过更多的工作,您还可以为 生成所有这些类型的键std::unordered_map,尽管您必须添加一些来自 Boost 的样板代码(使用hash_combine)。

于 2012-09-15T15:29:11.960 回答
2

std::map允许您在构造函数中提供比较运算符。您可能需要提供这样的 Comparator 以便两个数组 {1,....} 和 {1,....} 匹配,因为它们可能是不同的实际对象。

于 2012-09-15T15:29:49.273 回答
1

映射中的键类型必须operator<为其定义。您可以operator<为您的数组类型定义,但有一个更简单的方法:将每个单词中的字母按字母顺序排序,并使用该排序后的字符串作为键。

于 2012-09-15T15:29:03.600 回答