2013-04-17 4 views
0

Я пишу хэш-таблицу, но сталкивался с трудностями. Я хочу инициализировать его содержимым стандартных контейнеров (вектор, список и т. Д.), Как карта:
map <string,int> m(a.begin(),a.end())
У меня следующее определение класса: template <class key,class val,class hashik=std_hash> class hash_table.
И я определяю конструктор:Конструктор шаблонов с использованием итераторов STL

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

Можете ли вы отправить [пример] (http://www.sscce.org/), что кто-то еще может попытаться скомпилировать? – Praetorian

ответ

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_. Этого должно быть достаточно, чтобы вы начали.

Также обратите внимание, что это полезный трюк, когда вам нужен тип, который вы не знаете, как заклинание, например, сложный указатель на функцию или лямбда (который вы вообще не можете произнести).

+0

Спасибо! Он работает сейчас! – perlik

Смежные вопросы