17

たとえば、次のことが可能です。

std::set<int> s;  
std::set<int>::iterator it = s.begin();

逆のことが可能かしら、例えば

std::set<int>* pSet = it->**getContainer**();  // something like this...
4

3 に答える 3

22

いいえ、これを行うためのポータブルな方法はありません。

イテレータには、コンテナへの参照さえない場合があります。たとえば、実装では、との両方の型T*として使用できます。これは、両方が要素を配列として格納するためです。iteratorstd::array<T, N>std::vector<T>

さらに、イテレータはコンテナよりもはるかに一般的であり、すべてのイテレータがコンテナを指すわけではありません(たとえば、ストリームの読み取りと書き込みを行う入力および出力イテレータがあります)。

于 2012-07-12T04:32:09.660 に答える
7

いいえ。イテレータを見つけたときに、イテレータが由来するコンテナを覚えておく必要があります。

この制限の考えられる理由は、ポインターが有効なイテレーターであることが意図されており、ポインターがどこから来たのかを把握するようにポインターに要求する方法がないことです(たとえば、4つの要素を配列にポイントした場合、そのポインターだけからどこにあるかを知ることができます)配列の先頭は?)。

于 2012-07-12T04:35:37.193 に答える
6

少なくとも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。イテレータを使用することの全体的なポイントは、要素がどこから来ているのかを知ることではありません。一方、コンテナへのポインタを取得できるイテレータが必要な場合は、イテレータを作成できます。

于 2017-08-31T20:26:33.127 に答える