我想用C++实现一个向量的散列表,下面是我的代码:
#include <cstdlib>
#include <string>
#include <iostream>
#include <vector>
using namespace std;
#include <ext/hash_map>
using namespace __gnu_cxx;
int main (int argc, char * const argv[]) {
std::vector<int> v;
hash_map<int, std::vector<int> > months;
v.push_back(28);
v.push_back(28);
v.push_back(28);
v.push_back(29);
months["february"] = v; //error = invlalid conversion from const char* to int
return 0;
}
上面的代码编译失败。错误包含在相关行的旁边。这和我省略可选参数(散列和比较)的值有什么关系吗?
7条答案
按热度按时间xlpyo6sf1#
您的哈希Map使用的是整数键而不是字符串。这应该可以修复它:
bq8i3lrv2#
不同于其他5个答案都是一样的。有一个固定的月数。将它们存储为字符串是没有必要的。一个
enum
可以帮助您引用它们的名称。这将是更有效的,但不是预优化。因为它也更有意义。字符串版本中像“feburary”这样的错别字会添加一个新的月份!如果它是enum
,你会得到一个编译错误,另外,如果你的编辑器使用自动完成,你就不必去查如何拼写feburary。如果你不想污染全局的名字空间,你可以把它放在一个名字空间里,而且现在把它们小写会更容易。
如果你想保持一月为1而不是二月,你也可以从1开始
enum
。这对你来说可能更有意义。我认为一般公众应该把一月称为0,但也许只有我这样认为。0可以改为NULL_MONTH或INVALID_MONTH,或者任何适合你的设计。nqwrtyyt3#
您已经将密钥类型指定为
int
,但是您试图提供一个字符串文本...cgfeq70w4#
键是
int
,并且你给出了一个字符串,将声明改为:x6yk4ghg5#
这个散列表的键是一个int,但您试图将字符串“february”放入其中。
iyfjxgzm6#
问题是months是一个hash_map,它的键是一个int。在
months["february"]
中,您传递的是一个char const *
。您可能希望使用syd::string作为键。例如
hash_map<std::string, std::vector<int> > months;
gblwokeq7#