たとえば、次のことが可能です。
std::set<int> s;
std::set<int>::iterator it = s.begin();
逆のことが可能かしら、例えば
std::set<int>* pSet = it->**getContainer**(); // something like this...
いいえ、これを行うためのポータブルな方法はありません。
イテレータには、コンテナへの参照さえない場合があります。たとえば、実装では、との両方の型T*
として使用できます。これは、両方が要素を配列として格納するためです。iterator
std::array<T, N>
std::vector<T>
さらに、イテレータはコンテナよりもはるかに一般的であり、すべてのイテレータがコンテナを指すわけではありません(たとえば、ストリームの読み取りと書き込みを行う入力および出力イテレータがあります)。
いいえ。イテレータを見つけたときに、イテレータが由来するコンテナを覚えておく必要があります。
この制限の考えられる理由は、ポインターが有効なイテレーターであることが意図されており、ポインターがどこから来たのかを把握するようにポインターに要求する方法がないことです(たとえば、4つの要素を配列にポイントした場合、そのポインターだけからどこにあるかを知ることができます)配列の先頭は?)。
少なくとも1つのstd
イテレータといくつかのトリックで可能です。メソッドstd::back_insert_iterator
を呼び出すには、コンテナへのポインタが必要です。push_back
さらに、このポインタはprotected
のみです。
#include <iterator>
template <typename Container>
struct get_a_pointer_iterator : std::back_insert_iterator<Container> {
typedef std::back_insert_iterator<Container> base;
get_a_pointer_iterator(Container& c) : base(c) {}
Container* getPointer(){ return base::container;}
};
#include <iostream>
int main() {
std::vector<int> x{1};
auto p = get_a_pointer_iterator<std::vector<int>>(x);
std::cout << (*p.getPointer()).at(0);
}
もちろん、これは実際的な使用法ではありませんstd
が、非常に特殊なものですが(たとえば、aをインクリメントすることはできません)、実際にそのコンテナーへのポインターを運ぶイテレーターの単なる例ですstd::back_insert_iterator
。イテレータを使用することの全体的なポイントは、要素がどこから来ているのかを知ることではありません。一方、コンテナへのポインタを取得できるイテレータが必要な場合は、イテレータを作成できます。