2009-07-21 25 views
0

お互いのイテレータを含む2つのコンテナを作成したいと思います。中間/間接の型を導入することなく、これをうまくやりたいと思います。これは可能ですか、コンテナのデータ型のサイズを知っているかに応じてイテレータの型を行いますか?ここでイテレータと循環参照のC++コンテナ

は、私がコンパイル取得したいのですが、いくつかのサンプルコードです:

#include <map> 
#include <deque> 
#include <string> 

class mapvalue_t 
{ 
    public: 
    std::deque< std::map<std::string,mapvalue_t>::iterator >::iterator i; 
}; 

typedef std::map<std::string,mapvalue_t> maptype_t; 
typedef std::deque<maptype_t::iterator> queuetype_t; 

int main(void) 
{ 
    maptype_t m; 
    queuetype_t q; 
} 

気にしないで、それは今コンパイルします。

+1

あなたの質問を編集してもらえないかどうかはわかりませんが、質問は良い習慣です。 –

答えて

2

queueの代わりにdequeを使用すると、これが機能します。 Queueはコンテナではなくファサードであるため、::iteratorコールをサポートしていません。 cplusplus.comから

キューがそれを要素にアクセスするメンバ関数の特定のセットを提供し、その基礎となる容器として特定のコンテナクラスのカプセル化されたオブジェクトを使用するクラスであるコンテナアダプタとして実装されています。要素は、特定のコンテナの「背面」にプッシュされ、その「前面」からポップされます。

1

イテレータの保存には非常に注意が必要です。コレクションを変更すると、すべてのイテレータを簡単に無効にできます。あなたは、IDまたは(管理された)ポインタを格納する方がずっと良いでしょう。

+0

確かに。イテレータの格納されたリストは、マップが変更されるたびに無効になります。マッピングにキー値を格納する必要があります。 – Kieveli

+0

本当ではありません。マップとリストの場合、要素を挿入して削除しても、イテレータは無効になりません(削除されるものを除いて)。 私の質問にはリストが含まれている必要があります。しかし、質問をもう一度更新する必要があるかどうかはわかりません。 – Alex77

+0

特定の実装に依存している場合。私はこれが標準によって保証されているとは思わない。 – DanDan