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 { /* ... */ };

Kこれは、 type のキーと typeの値を持つハッシュ テーブルを宣言します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これは、getおよびsecondメンバーに逆参照できるイテレータと自動的に一致します。mapmultimapおよびそのunordered_いとこを含む標準コンテナの中で。それはあなたが始めるのに十分なはずです.

また、これは、複雑な関数ポインターやラムダ (スペルがまったくわからない) など、スペルがわからない型が必要な場合に便利なトリックであることに注意してください。

于 2013-04-17T16:15:28.320 に答える