C ++中向量的Hashmap

时间:2011-12-11 23:14:42

标签: c++ vector hashmap

我想在C ++中实现向量的hashmap。这是我的代码:

#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;
}

上面的代码无法编译。相关行旁边包含错误。是否与我有任何关系,省略了可选参数的值(哈希和比较)?

6 个答案:

答案 0 :(得分:3)

您的hashmap使用整数键而不是字符串。这应该解决它:

hash_map<std::string, std::vector<int> > months;

答案 1 :(得分:3)

您已将密钥类型指定为int,但您尝试提供字符串文字...

答案 2 :(得分:1)

键是int,你给的是一个字符串。将声明更改为:

hash_map<std::string, std::vector<int> > months;

答案 3 :(得分:1)

hash_map<int, std::vector<int> > months;

这个hashmap的关键是一个int,但你试图将字符串“february”放入其中。

答案 4 :(得分:1)

问题是month是一个hash_map,其键是一个int。在months["february"]您传递了char const * 您可能希望使用syd :: string作为键。

e.g。      hash_map<std::string, std::vector<int> > months;

答案 5 :(得分:1)

不同于其他5个完全相同的答案。有固定的月数。没有必要用字符串存储它们。 enum可以帮助您按名称引用它们。这样会更有效,但不是预优化,因为它也更有意义。字符串版本中的“feburary”这样的拼写错误会增加新的一个月!如果它是enum你会得到一个编译错误,如果你的编辑使用自动完成,你将不必查找如何拼写februrary。

enum { JANUARY=0, FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY,AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER};
months[FEBRUARY] = v; 

如果您不想污染全局命名空间,可以将其放在命名空间中。此时将它们设置为小写会更容易。

namespace Month {
enum { January=0, February,March,April,May,June,July,August,September,October,November,December};
}
months[Month::February] = v; // equivalent to months[1]=v if you prefer number

如果你想让1月份为1而不是2月,你也可以在1开始enum。这可能对你更有意义。我认为一般公众应该把1月称为0,但也许这只是我。 0可以更改为NULL_MONTH或INVALID_MONTH,或者适合您的设计。