Es ist möglich mit mindestens einem der std
Iteratoren und einige Tricks. Der std::back_insert_iterator
benötigt einen Zeiger auf den Container, um seine push_back
-Methode aufzurufen. Außerdem ist dieser Zeiger nur protected
. Diese
#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);
}
ist natürlich keine praktische Verwendung, sondern lediglich ein Beispiel für eine std
Iterator, der in der Tat trägt einen Zeiger auf seinen Behälter, wenn auch ein ganz besonderes (z. B. Erhöhung eines std::back_insert_iterator
ist ein noop). Der entscheidende Punkt bei der Verwendung von Iteratoren ist nicht zu wissen, woher die Elemente kommen. Wenn Sie andererseits einen Iterator wünschen, mit dem Sie einen Zeiger auf den Container erhalten, können Sie einen schreiben.
Ich bin interessiert zu wissen, warum Sie das wollen. – chris
Was ich versuche ist, den Zustand des Iterators während einer Traversierung (einer anderen Datenstruktur) zu speichern, damit ich den Iterator beim nächsten Besuch inkrementieren kann. Wenn das obige möglich ist, muss ich nicht den Verweis/Zeiger auf den Container selbst halten, sondern nur den Zeiger auf diesen Iterator. –