C++中向量的哈希Map

tmb3ates  于 2022-12-20  发布在  其他
关注(0)|答案(7)|浏览(98)

我想用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;
}

上面的代码编译失败。错误包含在相关行的旁边。这和我省略可选参数(散列和比较)的值有什么关系吗?

xlpyo6sf

xlpyo6sf1#

您的哈希Map使用的是整数键而不是字符串。这应该可以修复它:

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

bq8i3lrv2#

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

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开始enum。这对你来说可能更有意义。我认为一般公众应该把一月称为0,但也许只有我这样认为。0可以改为NULL_MONTH或INVALID_MONTH,或者任何适合你的设计。

nqwrtyyt

nqwrtyyt3#

您已经将密钥类型指定为int,但是您试图提供一个字符串文本...

cgfeq70w

cgfeq70w4#

键是int,并且你给出了一个字符串,将声明改为:

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

x6yk4ghg5#

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

这个散列表的键是一个int,但您试图将字符串“february”放入其中。

iyfjxgzm

iyfjxgzm6#

问题是months是一个hash_map,它的键是一个int。在months["february"]中,您传递的是一个char const *。您可能希望使用syd::string作为键。
例如hash_map<std::string, std::vector<int> > months;

gblwokeq

gblwokeq7#

map          // Instead of hash_map
string       // Instead of int
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <map>

using namespace std;

int main()
{
    std::vector<int> v;
    
    map<std::string, std::vector<int> > months; 
    v.push_back(28);
    v.push_back(28);
    v.push_back(28);
    v.push_back(29);
    months["February"] = v;
    for(int i=0; i<months["February"].size(); i++){
        cout << months["February"][i] << " ";
    }
    
    return 0;
}

相关问题