Iterator für eine Teilmenge eines Vektors

8

Ist es möglich, einen konstanten Iterator von einem Vektor zu erhalten, der nur einen bestimmten Bereich des Vektors durchlaufen kann, bevor er ungültig gemacht wird?

Wenn ich beispielsweise einen Vektor mit 10 Elementen habe, möchte ich einen Iterator der Elemente 4 bis 7 zurückgeben.

Pseudocode:

%Vor%     
KaiserJohaan 29.05.2015, 22:37
quelle

5 Antworten

10

Das ist ziemlich trivial (obwohl ich das Ergebnis als Bereich, nicht als Iterator bezeichnen würde).

Eine einfache Implementierung würde etwa so aussehen:

%Vor%

Wie es jetzt aussieht, folgt dies normalen C ++ - Konventionen (0-basiertes Zählen, das Ende, das Sie angeben, ist über dem Ende des Bereichs, nicht drin). Um die gewünschte Ausgabe zu erhalten, würden Sie a angeben Bereich von 3, 7 , wie:

%Vor%

Beachten Sie, dass die bereichsbasierte for -Schleife weiß, wie die% member-Funktionen begin und end verwendet werden, um den zu iterierenden Bereich anzugeben, so dass wir nicht mit dem Iterator ungültig machen müssen wir müssen nur den Anfang und das Ende des Bereichs angeben, der uns wichtig ist.

    
Jerry Coffin 29.05.2015, 23:01
quelle
3

Sie könnten die range-v3 Bibliothek verwenden, die die Basis eines Ranges TS ist Das ist Teil von C ++ 20 , aber die Bibliothek funktioniert bereits mit C ++ 11-Compilern. Hier ist wie:

%Vor%

Live-Beispiel .

    
TemplateRex 30.05.2015 10:46
quelle
1

Es gibt nichts in der Standardbibliothek, um dies explizit zu tun, aber wenn Sie Boost verwenden möchten, können Sie den folgenden Ansatz mit dem range -Konzept verwenden:

%Vor%

Dies sollte 4567

ausgeben     
Baldrick 29.05.2015 22:50
quelle
1

Sie können dies verwenden

%Vor%

Der Code unten ist eine kleine Demonstration

%Vor%

Die Ausgabe ist

%Vor%     
Rafayel Paremuzyan 07.01.2018 00:07
quelle
-1

Sie können eine span verwenden :

%Vor%

Anmerkungen:

  • In Ihrem Beispiel haben Sie das vierte bis siebte Element erhalten, d. h. die Indizes 3 bis 6, was ich hier verwendet habe.
  • Dieser Code sollte für jeden Container und nicht nur für einen Vektor funktionieren.
  • Bereiche sind Teil der GSL, Support-Bibliothek für die C ++ - Kernrichtlinien . Sie können 2020 offiziell in den C ++ - Standard aufgenommen werden und werden von der Community sehr positiv aufgenommen.
einpoklum 07.01.2018 00:16
quelle

Tags und Links