2010-11-20 11 views
3

Ich versuche, einen Zwei-Durchlauf-Algorithmus zu schreiben, der einigen Legacy-Code enthält. Ich möchte einen bestimmten Container zweimal durchlaufen, einmal in der Reihenfolge und einmal in umgekehrter Reihenfolge. Offensichtlich war mein erster Gedanke, eine iterator und eine reverse_iterator zu verwenden, aber seltsamerweise sahen die Entwerfer der Behälterklasse, die ich benutze, nicht einen funktionierenden reverse_iterator für den Behälter zu definieren (reverse_iterators kann hier nicht dereferenziert werden wie iterators sein kann). Ich habe bereits einen Algorithmus, der eine reverse_iterator erfordert.C++ Reverse_iterator Alternativen

Mein Gedanke ist, den ersten Durchgang Iterator für den ersten Teil des Algorithmus zu verwenden, und als ich den Algorithmus push_front die Elemente in einen neuen Behälter durchführen, dann durch die neuen Container laufen. Dies wird Speicher beanspruchen, der in meiner Anwendung nicht kritisch ist, aber ich frage mich: Gibt es sauberere Alternativen zu reverse_iterators in C++, oder sollte ich mir die Zeit nehmen, meinen Algorithmus nur mit Forward iterators zu überarbeiten?

Antwort

4

Wenn Sie die Elemente eines Containers in umgekehrter Reihenfolge durchlaufen müssen, müssen Sie nicht unbedingt einen Reverse-Iterator verwenden.

Wenn der Container bidirektionale Iteratoren hat, dann kann man gewöhnliche Iteratoren verwenden und --itend()-begin() iterieren statt ++it der Verwendung begin()-end() iterieren.

Da dies ein bisschen schwierig ist, können Sie die std::reverse_iterator Wrapper verwenden, um einen gewöhnlichen Iterator in einer umgekehrten Iterator zu konvertieren (das im Grunde tauscht ++ und -- und kapselt die Tricks erforderlich, um diese an die Arbeit).

Wenn der Container keine bidirektionalen Iteratoren hat, bedeutet dies, dass es nicht möglich ist, die Elemente des Containers in umgekehrter Reihenfolge zu durchlaufen. In diesem Fall müssten Sie entweder den Algorithmus neu schreiben oder einen anderen Container verwenden.

Jeder Container, der bidirektionale Iteratoren hat, sollte bieten umgekehrte Iterator-Funktionalität; Dies ist Teil des STL und C++ Standard Library "Container" -Konzepts.

+0

Danke, es sieht so aus, als ob der Iterator bidirektional ist. Die Klasse verwendet tatsächlich 'std :: reverse_iterator', um ihren' reverse_iterator' zu implementieren, aber wenn ich versuche, sie zu verwenden und zu dereferenzieren, erhalte ich einen Compilerfehler. – Zeke

+1

@Zeke: Sie müssen den Code, den Sie verwenden, und die genauen Compilerfehler posten; Ansonsten ist es schwer zu helfen. :( –

+0

@James: Fair genug. Ich denke, ich habe die '--it' Idee funktioniert, aber haben Sie irgendwelche Vorschläge für die' for' Schleife Zustand? Ich würde '' '' '- verwenden (it; it ! = end; --it) 'aber dann verpasse ich den letzten Punkt. Kann ich den Zustand ändern oder muss ich den Loop-Code einfügen, nachdem der Loop-Body beendet ist? – Zeke