3

入力された順序でマップされたデータをトラバースできるようにするコードを作成しました。

私が数回コーディングした解決策は次のとおりです。

キータイプ K とデータ型 D を指定すると、std::map std::vector

データ エントリをランダムに見つけたい場合は、 を使用しますmap.find(K)。入場順にマップを横断したい場合は、 を使用しますstd::vector::iterator (begin(), end()]

'OrderedMap'これでも問題ありませんが、演習として、これを STL 準拠のコンテナーとして記述したいと思いました。私も持っています(この議論に要約されます):

template <typename K, typename D>
class OrderedMapValue
{
private:
    K first_ref;
    std::map<K,size_t>& m;
    std::vector<D>& v;
public:
    const K& first
    D& second
    assignment operator=(const D& data) 
    {
        std::map<K,size_t>::const_iterator iter = m.find(first_ref);
        v[iter.second] = data;  // error checking of iter stripped
    }
};

さらに仮定すると

template <typename K, typename D>
class OrderedMap
{
public:
     typename OrderedMapValue<K,D>& OrderedMap<K,D>::operator[](const K&);
     // snip...
};

class MyClass
{
public:
    MyClass(std::string s) : _my_data(s) {}
private:
    std::string _my_data;
};

次のコードが機能します。

OrderedMap<std::string,MyClass*> omap;
omap["MyKey"] = new MyClass("dummy");

ただし、このコードは次のことを行いません。

OrderedMap::iterator iter = omap.find("MyKey");
MyClass * obj = iter->second;
delete obj;
iter->second = new MyClass("dummy");

私が何かをしたと仮定すると、a) 構造的にばかげている、または b) 不必要に複雑な場合、これをどのように行う必要がありますか?

ここで車輪を再発明する可能性が高いことは認識していますが、繰り返しになりますが、この取り組みは主に、STL コンテナー、その設計パターン、および適切な使用に関する知識を増やすことです。

ご意見をお寄せいただきありがとうございます。

4

2 に答える 2

2

現在、これをテストするためのコンパイラがないため、エラーが発生する可能性がありますが、次のようにしたいと思います。

template <typename K, typename D>
class OrderedMap
{
private:
        std::map<K,size_t> &m;
        std::vector<D> &v;
public:
    typename pair<K,D> TYPE;

        TYPE& operator[](const K &k)
    {
        return v[ m[ k ]];
    }

    TYPE& operator[](size_t idx)
    {
        return v[ idx ];
    }

    pair<iterator,bool> insert( const TYPE& pair )
    {
        map<K, size_t>::const_iterator iter;
        iter = m.find( pair.first );

        if( iter != m.end() )
            return make_pair( v[ iter.second], false );

        m.insert( make_pair( pair->first, v.size() ));
        v.push_back( pair->second );

        return make_pair(  v.last() , inserted );
    }

    iterator &begin()
    {
        return v.begin();
    }
    // etc
};
于 2009-03-20T04:04:32.417 に答える
0

にはOrderedMapValue::operator=、次のものがあります。

    std::map<K,size_t>::const_iterator iter = m.find(first_ref);

とはfirst_ref? コードは他の場所でそれを参照していません (しゃれた意図はありません)。古い実装の痕跡であり、他の場所で public メンバーに置き換えられているように見えます

const K& first.

これが問題でしょうか?

コメントからの編集:コードは、first_ref がどこでも初期化されていることを示していません。したがって、私が知る限り、への呼び出しm.find(first_ref)は OrderedMapValue のキーではなく、空の文字列を検索しています。

于 2009-03-20T03:23:58.927 に答える