3

テンプレートを使用して独自の辞書を作成しています(STLの辞書は使用できません。使用しません)

非常にシンプルな検索機能が欲しいのですが、ちょっとした問題があります。

template <typename TElement>
void Dictionary<TElement>::search(TElement ADT, int key) {  // Abstract Data Type
    inf flag = 0;
    index =  int (key % max);
    temp[index] = root[index]; // root of the hash
    while (temp[index]->next != NULL) {
        if(temp[index]->data->key_actual_name == key) { @things happen }
    }
}

私が理解したいこと:temp[index]->data-><template call>それが理にかなっているなら私が持つことができるようにテンプレートを使用する方法

Class_type == TElementを使用して辞書を呼び出したいのですが、「key」は常にintですが、異なる場合もあります。IDまたは電話番号の可能性があります。問題は、キーの実際の名前(if(temp[index]->data->ID (or phone or what ever) == key){@thingsoccur})を使用する必要があることです。ここでテンプレートを使用できると思いますが、方法がわかりません。

また、関連する可能性があります:

template <typename TElement>
typedef struct list{
    TElement data;
    struct list *next;
}node_type;
node_type *ptr[max], *root[max], *temp[max]; 

また、key_actual_nameのテンプレートを使用する場合、実装はどのように機能し、その関数をどのように呼び出すのでしょうか。

4

2 に答える 2

5

find_if比較のための追加のパラメータがあるような標準ライブラリ関数からいくつかのインスピレーションを得ることができます。

template <class InputIterator, class Predicate>
InputIterator find_if ( InputIterator first, InputIterator last, Predicate pred );

search次に、探しているキーを見つける方法を関数に指示するパラメーターを渡すことができます。おそらくの使用をに置き換え==ます

if(pred(temp[index]->data, key)) { @things happen }

predキーを適切なメンバーと比較するためのさまざまな関数を渡します。

于 2012-05-29T14:45:07.743 に答える
1

私が正しく理解している場合:

temp[index]->data->key_actual_name

intであるTElementのデータメンバーに解決され、それをテンプレートにします。その場合は、これを行うことができます:

template <template <class> class TElement, typename TKey>
struct node_type
{
    TElement<TKey> data;
    node_type *next;
};

template <template <class> class TElement, typename TKey>
class Dictionary
{
    typedef node_type<TElement, TKey> node_t;
    node_t _root;

    void search(node_t& node, const TKey& key)
    {
        TKey& thekey = node.data.key_actual_name;
        // Do some algorithm
    }
public:
    void search(const TKey& key)
    {
        search(_root, key);
    }
};

template <class T>
struct Element
{
    T key_actual_name;
};

int main(int argc, char ** argv)
{
    Dictionary<Element, int> dic1;
    dic1.search(1);

    Dictionary<Element, char> dic2;
    dic2.search('a');

    return 0;
}

ご覧のとおり、Elementにはテンプレートパラメーターがあるため、key_actual_nameのタイプをケースに合わせて変更できますが、検索関数に一般的な方法でアクセスさせることができます(operator ==オーバーロードがあると想定)。

于 2012-05-29T15:00:45.147 に答える