【问题标题】:Using an array as key in map C ++在 map C++ 中使用数组作为键
【发布时间】:2012-09-15 15:22:07
【问题描述】:

基本上,我需要找到一个单词的所有匹配字谜。我正在做的是使用一个大小为 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++ 中这是不可能的。在我找到的所有其他答案中,他们建议使用向量作为键,但这不适用于我的情况(我认为。)

【问题讨论】:

  • 正如下面的答案所反映的,C 风格的数组不会像您期望的那样复制。
  • 包含dictionaryletters 的定义会有所帮助。

标签: c++ arrays dictionary


【解决方案1】:

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

#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)。

【讨论】:

  • std::string 并没有真正争做密钥类型。
  • @LucDanton: string 将在紧要关头完成,它是唯一为其定义了现成哈希函数的类型。因此,如果哈希表在计算上是必不可少的,那么使用字符串会比在向量上定义自己的哈希操作更容易。否则你当然有一个有效的观点。
  • 当我尝试这样做时,我得到一个“'
  • @user1525047:std::array 需要 C++11 支持。在 GCC 中,将 -std=c++0x 添加到您的编译器命令中。或者,使用&lt;tr1/include&gt;std::tr1::array
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 不过,由 12000 个'a's 组成的字符串会相当低效。
    猜你喜欢
    • 2010-11-06
    • 1970-01-01
    • 2012-01-06
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    相关资源
    最近更新 更多