在地图C ++中使用数组作为键

时间:2012-09-15 15:22:07

标签: c++ arrays map

基本上,我需要找到一个单词的所有匹配的字谜。我正在做的是使用大小为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 个答案:

答案 0 :(得分:8)

所有std::array<T, 26>std::stringstd::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 <

将int数组更改为结构
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>