0

我正在写一个哈希表,但我遇到了一个困难。我想用标准容器(向量、列表等)的内容来初始化它,比如地图:
map <string,int> m(a.begin(),a.end())
我有以下类定义:template <class key,class val,class hashik=std_hash> class hash_table.
我定义了一个构造函数:

template <template <class> class C> hash_table(typename C<pair <key,val> >::iterator first,typename C<pair <key,val> >::iterator last)
{
    init();
    for(pair <key,val>* it=first;it!=last;++it)
        this->operator[](it->first)=it->second;
}

但它不编译。呼叫没有匹配的功能。例如:

vector <pair <string,int> > a;
...
hash_table <string,int> m(a.begin(),a.end()); //compilation error

我究竟做错了什么?您可以建议我阅读哪些有关模板的书籍?

4

1 回答 1

1

您试图对您将接受的类型过于具体。要记住的关键是模板将匹配几乎任何东西,只要它编译。如果我正确地破译了你的代码,你有一个这样的类:

template <typename K, typename V> hash_table { /* ... */ };

这声明了一个带有 type 键和 typeK值的哈希表V。要编写一个接受地图元素的构造函数,请声明构造函数,使其也是一个模板:

template <typename Iter>
hash_table(Iter first, Iter last)
{
    init();
    for (Iter it = first; it != last; ++it)
        this->operator[](it->first)=it->second;
}

这将自动匹配任何可以取消引用以获取firstsecond成员的迭代器。map在标准容器中,包括multimap及其unordered_表亲。这应该足以让你开始。

另请注意,当您需要一种您不知道如何拼写的类型时,这是一个有用的技巧,例如复杂的函数指针或 lambda(您根本无法拼写)。

于 2013-04-17T16:15:28.320 回答