0

mapオブジェクトのベクトルを格納する を含むクラスがありshared_ptrます。

#include <map>
#include <memory>
#include <vector>

template <class T, class U>
class MyMap {
public:
    typedef std::shared_ptr<U> UPtr;
    typedef std::vector<UPtr> UPtrVec;
    typedef std::map<T, UPtrVec> VecMap;
    ...
private:
    VecMap vec_map;
};

マップされた各ベクトル値内の値に対して (ブーストを使用して) イテレータを作成することは可能ですか? また、指定されたキーのリストに対して格納された値を反復処理できるようにしたいと考えています。

たとえば、マップに次のようなデータが含まれているとします (簡潔にするために Python 構文に切り替えます)。

 // note: in actuality the vector contents are shared_ptr's to objects
 vec_map[5] = ["one", "two", "three"]
 vec_map[8] = ["four", "five"]
 vec_map[3] = ["six", "seven", "eight", "nine"]

次のことができるようにイテレータ インターフェイスを作成することは可能ですか。

MyMap<int, std::string> mymap
...
for(auto it = mymap.begin(), it != mymap.end(); ++it) 
    cout << *it << " ";

そして、「1 2 3 4 5 6 7 8 9」を出力しましたか?それを機能させることができれば、キー値に基づいてフィルター処理するイテレーターを書きたいと思います。

すべてのオブジェクトをフラットリストにUPtrVec格納するクラスで別のものを作成することを考えていたことを除いて。しかし、キー情報をオブジェクトUPtrに埋め込まない限り、キー値に基づいてフィルタリングできるマッピングを失います。U

4

1 に答える 1

1

標準の C++ を使用するだけで、独自のイテレータを作成できます。

必要なイテレータのタイプに応じて、iterator標準のイテレータ タグ ( input_iterator_tagoutput_iterator_tagforward_iterator_tag、 ) のいずれかを使用してクラスを作成し、if クラスを継承します。(あなたが示すサンプルには十分です)。bidirectional_iterator_tagrandom_access_iterator_taginput_iterator_tag

型に必要なイテレータ インターフェイスをそのクラスに実装します。(cppreference.com では、各反復子の要件を見つけることができます)。

class MyIterator: public std::iterator<input_iterator_tag, MyClass> {
    // requirements for iterators
    MyIterator(const MyIterator&);
    MyIterator& operator=(const MyIterator&); // or any variant
    ~MyIterator() noexcept;
    MyClass& operator*() const;
    MyIterator& operator++();

    // requirements for input iterators
    MyClass* operator->();
    MyIterator operator++(int);
};

// requirements for iterators
bool operator==(const MyIterator& a, const MyIterator& b);
// requirements for input iterators
bool operator!=(const MyIterator& a, const MyIterator& b);

実装されたイテレータは、使用されたマップ (またはMyMap実装方法に応じてオブジェクト) への参照、マップ内のベクトルへの参照 (たとえば、イテレータを使用)、およびベクトル内の要素への参照 (繰り返します) を持つ必要があります。たとえば、イテレータを使用します)。

于 2013-06-07T15:35:14.480 に答える