基本上,我需要找到一个单词的所有匹配的字谜。我正在做的是使用大小为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 ++中这是不可能的。在我发现的所有其他答案中,他们建议使用矢量作为关键,但这不适用于我的情况(我认为。)
答案 0 :(得分:8)
所有std::array<T, 26>
,std::string
和std::vector<T>
都是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
)。 / p>
答案 1 :(得分:2)
std::map允许您在构造函数中提供Compare运算符。您可能需要提供这样的比较器,以便匹配两个数组{1,....}和{1,....},因为它们可能是不同的实际对象。
答案 2 :(得分:1)
地图中的键类型必须为其定义operator<
。您可以为数组类型定义operator<
,但有一个更简单的方法:将每个单词中的字母按字母顺序排序,并使用排序后的字符串作为键。
答案 3 :(得分:0)
使用operator <
:
struct letter_counter {
static const unsigned SIZE = 26;
int data[SIZE];
friend bool operator < (const letter_counter& l, const letter_counter& r)
{
for (unsigned i = 0; i < SIZE; ++i) {
if (l.data[i] < r.data[i])
return true;
if (l.data[i] > r.data[i])
return false;
}
return false;
}
};
或者如果您的编译器支持C ++ 11,只需使用std::array<int,26>
。