2012-04-01 6 views
0

Ich habe einen leeren Container mit reserviertem Speicher. Meine Funktion (Algorithmus) benötigt keinen Container, sondern nur den Iterator. Wie fügt man dem Container in dieser Funktion Elemente hinzu? Ich muss Speicher reservieren und den Konstruktor aufrufen, aber wie kann ich den Konstruktor aufrufen, auf den der Iterator verweist?Wie fügt man dem Container, der nur einen Iterator hat, Elemente hinzu?

+0

Bitte erläutern Sie, warum Sie nur einen Iterator haben. Die meisten Iteratoren lassen Sie den Container nicht ändern; Sie müssen Zugriff auf den Container dafür haben. Übrigens besteht der Unterschied zwischen einem Iterator und einem Const-Iterator darin, ob Sie das Element und nicht den Container ändern können. –

+0

Auch ** bitte markieren Sie die richtigen Antworten auf Ihre Fragen. ** –

+0

Es ist eine Voraussetzung – user1290126

Antwort

4

Normalerweise mit etwas wie ein std::inserter_iterator. Dies beseitigt jedoch normalerweise nicht die Notwendigkeit für einen Zeiger oder eine Referenz auf den Container - es speichert nur diese Referenz innerhalb des Iterators selbst.

Wenn Sie einen voreingestellten Iterator-Typ haben, ist das nicht hilfreich. Wenn Sie etwas wie einen normalen Algorithmus haben, der nur etwas verwenden und verwenden muss, das ein Iterator-Interface verwendet, um es in die Sammlung einzufügen, funktioniert es wunderbar.

+0

std :: inserter_iterator muss einen Container aufnehmen. Aber es wird nicht vom Algorithmus übernommen – user1290126

+0

Sie füttern den Container zu dem 'inserter_iterator', wenn Sie den Iterator erstellen, bevor Ihre Funktion aufgerufen wird. Danach brauchen Sie nur den Iterator. –

+0

Also, ich habe nur ein Element zum Container mit insert_iterator hinzugefügt. Und dann erschien ein Fehler. Wo sollte insert_iterator zeigen, beginnen oder enden? Und sollte ich es erhöhen? – user1290126

2

Sie können kein Element in einen Container ohne Verweis/Zeiger auf diesen Container einfügen.

Sie können jedoch ein Element überschreiben (vorausgesetzt, Sie haben keine const_iterator). Etwas wie:

*it = T(params); 

wo T ist der Typ in Frage.

3

C++ hat das Konzept eines insert_iterator, wovon ich ausgehe?

zum Beispiel:

#include <iostream> 
#include <iterator> 
#include <vector> 

int main() 
{ 
    int my_array[] = { 1,2,3,4,5,6,7,8,9,10 }; 
    std::vector<int> my_vector; 

    std::copy(std::begin(my_array), 
       std::end(my_array), 
       std::back_inserter(my_vector)); 
} 
+0

Ich kann den Container nicht benutzen! Ich habe nur einen Iterator. – user1290126

+2

@ user1290126: besser aussehen. 'std :: copy' weiß nichts über' my_vector', es wird nur ein Iterator übergeben, und trotzdem wird es in den Vektor kopiert und erweitert. Dies ist der magische Hintergrund eines 'Output Iterators'. Hier erzeugt 'std :: back_insert (my_vector)' einen Iterator, der beim Anfügen an den Vektor geschrieben wird. –

+0

@ user1290126 Welche Art von Iterator haben Sie?Ein insert_iterator kann Daten einfügen, weil er den Container kennt. Wenn Sie jedoch nur einen normalen forward_iterator haben, ist die Frage, die Sie stellen, eher wie "Wie skaliere ich ein Array mit nur einem Zeiger auf ein element "- zu dem die Antwort einfach" you can not "lautet - Normalerweise ist es Aufgabe des Aufrufers der Funktion, zu entscheiden, welche Art von Iterator verwendet werden soll und ob dieser Iterator in der Lage ist, den Container zu modifizieren. –

3

Sie kann nicht Container ändern, nur Traverse Iterator aufweist; Sie können stattdessen stattdessen iterator einfügen.

Bearbeitet: Wenn Sie Speicher reservieren müssen Sie wissen, wie viele Elemente es enthalten wird. Dann können Sie leere Elemente hinzufügen, bevor Sie sie an die Funktion übergeben, und sie mit dem Iterator füllen und inkrementieren. Danach können Sie diesen Iterator zurückgeben und er wird auf die Position verweisen, an der die nützlichen Daten enden.

+0

keine gute Idee, weil ich mögliche maximale Anzahl von Elementen kenne, und wenn der Container assoziativ ist, können solche leeren Elemente nicht am Ende stattfinden – user1290126

Verwandte Themen