Hinzufügen von Daten zum STL-Container ohne rohe Schleifen

8

Ich habe oft gesehen, dass Sie alle handgeschriebenen / rohen Schleifen durch STL-Algorithmen ersetzen können. Nur um mein C ++ - Wissen zu verbessern, habe ich genau das versucht.

Um einen std :: Vektor mit Daten zu füllen, verwende ich eine for-Schleife und den Schleifenindex.

%Vor%

Der obige Code funktioniert einwandfrei. Wie Sie sehen können, verwende ich den For-Schleifen-Index 'i', damit der Algorithmus korrekt ist.

Wie kann jemand diese for-Schleife durch etwas vom Standard ersetzen?

Die einzigen Funktionen, die ich gesehen habe und die es mir fast erlauben, sind std :: transform und std :: generate, aber beides würde nicht funktionieren, weil ich einen Indexwert benötige, um den Code zu erhöhen.

EG:

%Vor%

Oder gehe ich einfach zu weit in die Idee "keine rohen Schleifen"?

    
Staeton Grey 14.10.2014, 10:45
quelle

5 Antworten

5

Sie können einfach eine Variable im Bereich von "generate_n" verwenden, um Ihre Variable zu deklarieren.

%Vor%     
adev 14.10.2014, 10:54
quelle
7

Die wirkliche Lösung wäre hier, ein angemessenes zu definieren Iterator, etwas wie:

%Vor%

In der Praxis vermute ich, dass Sie damit durchkommen könnten operator* gibt einen Wert zurück, den Sie an diesem Punkt berechnen, und kein myValue Mitglied haben.

Zu verwenden:

%Vor%

(Die Amplitude und die Frequenz sind für das Ende irrelevant Iterator, da es nie dereferenziert wird.)

Idealerweise wäre dies ein random_access_iterator, so dass der Konstruktor zu Vektor berechnet die Anzahl der Elemente und Vorzuordnen sie. Dies beinhaltet viel mehr zu implementieren funktioniert jedoch.

Wenn du mutig bist und ähnliche Dinge tun musst, du könnte darüber nachdenken, den Iterator zu einer Vorlage zu machen instanziiert über die Funktion, die Sie interessiert.

Und obwohl ich in letzter Zeit keine Chance hatte mit ihnen zu spielen, wenn Wenn Sie Boost verwenden, könnten Sie eine Verkettung in Betracht ziehen a transform_iterator und a counting_iterator . Es ist immer noch ein bisschen wortreich, aber die Leute, die die Iteratoren bei Boost gemacht haben das Beste, was sie konnten, angesichts des etwas kaputten Designs von STL Iteratoren.

    
James Kanze 14.10.2014 11:52
quelle
5

Ich würde counting_iterator in der Boost-Bibliothek empfehlen. Ein Paar Zähl-Iteratoren bietet Ihnen einen Bereich von Ganzzahlen. Offensichtlich gibt es keinen zugrunde liegenden Container. Es liefert die Ganzzahl "träge". Die Bibliothek stellt die Factory-Funktion make_counting_iterator zum Erstellen bereit.

back_insert_iterator (mit Factory-Funktion back_inserter ) in der Standardbibliothek (header iterator ) ruft effektiv das Mitglied push_back des Containers auf.

Mit diesen Zutaten können Sie transform mit dem "index" verwenden.

%Vor%

Der Ausdruck:

%Vor%     
Nicky C 14.10.2014 12:47
quelle
1

nicht unbedingt besser, aber eine Lösung mit stl:

%Vor%     
TNA 14.10.2014 10:55
quelle
0

Ich sehe ein paar Möglichkeiten, die ich noch nicht erwähnt habe. Man würde mit einem Iterator für eine Reihe von Zahlen beginnen:

%Vor%

Dann würdest du das mit einer Entfernungsschleife verwenden, um die eigentliche Arbeit zu erledigen:

%Vor%

Eine andere Möglichkeit wäre, den Job in ein paar Schritten auszuführen:

%Vor%

Dies beginnt, indem das Array mit den aufeinanderfolgenden Werten von i (d. h. den Eingaben für die Funktion) gefüllt wird, und transformiert dann jeden dieser Eingaben in den übereinstimmenden Ausgabewert.

Dies hat jedoch zwei mögliche Nachteile:

  1. Wenn der Wert von i möglicherweise den Wert überschreitet, der in short gespeichert werden kann, wird der Eingabewert möglicherweise während der anfänglichen Speicherphase abgeschnitten. Es ist nicht klar, ob Ihre Verwendung von int für i die Möglichkeit widerspiegelt, dass sie eine größere Größe haben könnte, oder ob Sie standardmäßig int verwenden.
  2. Es durchläuft den Ergebnisvektor zweimal. Wenn der Vektor groß ist (insbesondere wenn er zu groß ist, um in den Cache zu passen), könnte dies wesentlich langsamer sein.
Jerry Coffin 14.10.2014 17:41
quelle

Tags und Links