2011-10-13 50 views
15

C++でiteratorからconst_iteratorを取得するにはどうすればよいですか? insert_iteratorconst_iteratorはどうですか?結果として得られるiteratorは元の場所と同じ場所を指すはずです。const_iteratorへのC++イテレータ

+0

キャスティングは機能しませんか? – Pubby

+1

@ Pubby8:キャストは必要ありません! –

+0

ええ、私は台無しにしているに違いない。暗黙的に変換しようとしたときにコンパイラエラーが発生したと思いました。 –

答えて

22

コンテナはconst_iteratorに変換タイプとしてiterator提供するために必要とされるので、あなたは、暗黙的に変換することができます:

Container::iterator it = /* blah */; 
Container::const_iterator cit = it; 

std::insert_iterator sが出力イテレータです。これにより、順方向イテレータでなければならない通常のContainer::iteratorに変換する方法はありません。

別の種類の挿入イテレータはこのようなことを許可しますが、標準機能から得られたものは許可しません。

私はあなたがが、保護されたメンバーiterを公開std::insert_iterator周りに独自のラッパーを書くことができますね。

template <typename Container> 
class exposing_insert_iterator : public std::insert_iterator<Container> { 
public: 
    exposing_insert_iterator(std::insert_iterator<Container> it) 
    : std::insert_iterator<Container>(it) {} 
    typename Container::iterator get_iterator() const { 
     return std::insert_iterator<Container>::iter; 
    } 
}; 

// ... 
std::insert_iterator<Container> ins_it; 
exposing_insert_iterator<Container> exp_it = ins_it; 
Container::iterator it = exp_it.get_iterator(); 
4

あなたがそれらを変換することができます。例:

std::vector<int> v; 
std::vector<int>::iterator it = v.begin(); 
std::vector<int>::const_iterator cit = it; 

しかし、私はそれがあなたが求めている答えではないと思います。コードを表示する:-)

関連する問題