我正在写一个哈希表,但我遇到了一个困难。我想用标准容器(矢量,列表等)的内容初始化它,如地图:
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
我做错了什么?有关模板的书籍可以建议我阅读吗?
答案 0 :(得分:1)
你试图对你接受的类型过于具体。要记住的关键是模板只要编译就会匹配任何东西。如果我正确地解密你的代码,你就会有这样一个类:
template <typename K, typename V> hash_table { /* ... */ };
这声明了一个哈希表,其键为K
,值为V
。要编写一个接受地图元素的构造函数,请声明构造函数,使其也是一个模板:
template <typename Iter>
hash_table(Iter first, Iter last)
{
init();
for (Iter it = first; it != last; ++it)
this->operator[](it->first)=it->second;
}
这将自动匹配可以解除引用以获取first
和second
成员的任何迭代器。在标准容器中,包括map
,multimap
和他们的unordered_
堂兄弟。这应该足以让你开始。
另请注意,当您需要一种不知道如何拼写的类型时,这是一个很有用的技巧,例如复杂的函数指针或lambda(根本不能拼写)。