簡単にするためにキーがint
のマップがあり、最小限のコンパイル例で問題を再現できるとします。私の場合、鍵ははるかに複雑な獣です。イテレーターは自分の立場に精通していますか?
int
の代わりにenum
と言う別のマップを作成するために、このマップを再利用したいと思います。このために私はint
をenum
に変換することを可能にする2つの機能を持っており、その逆もあります。
全体ではなくクラスを書き換え、私は、組成物を使用して、私は私の新しいクラスMYMAP内部この場合には(map<int,int>
を自分のマップを置く。
私は次の実装を始めたが、私はカスタムに問題があります
class myMap
{
private:
std::map<int, int> m;
public:
typedef std::map<int, int> map_type;
typedef enum { X1=0, X2, X3, INVALID } key_type;
typedef int mapped_type;
typedef pair<key_type, mapped_type> value_type;
/* conversions from int to key_type and vice versa */
friend key_type int2K(int k);
friend int K2int(key_type k);
class Iterator
{
private:
map_type::iterator it;
key_type K;
public:
Iterator(map_type::iterator & i) :
it(i), K(int2K(i->first)) {} //<= Error if i is not valid (points to the end)
};
typedef Iterator iterator;
iterator end() { return iterator(m.end()); }
// other parts of the class skipped for concisness
};
myMap::key_type int2K(int k) {
return (k == 0 ? myMap::X1 :
(k == 1 ? myMap::X2 :
(k == 3 ? myMap::X3 :
myMap::INVALID))); }
int K2int(myMap::key_type k) { return k; }
私はマップの最後にMYMAPのイテレータを初期化すると、それは失敗します:
私はstd::iterator
を継承することを選択し、また
map<int,int>::iterator
からではなく、再構成を使用していない私のクラスAのイテレータ
myMap m;
myMap::iterator i = m.end(); //<= fails here
イテレータがマップの最後を指しているかどうかをコンストラクタでチェックする方法はありますか?もしそうなら、どのように?
「Iterator」を参照するときにのみ変換を行うことができます。 – Jarod42
ブーストでiterator_facadeをチェックアウト – sp2danny
@ sp2danny iterator_facadeは知っていますが、私の問題を解決するつもりはありません。私の問題は、イテレータがどのインタフェースを満たす必要があるかを知ることではなく、イテレータクラスの設計上の問題です。 – Heyji