Verschieben von Positionen in C++ [] (Verschieben von Positionen in C++), Lektion, Seite 723720
https://www.purl.org/stefan_ram/pub/positionsverschieben_c++ (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C++-Kurs

Verschieben von Positionen in C++ 

Hier darf die Position nicht »const« sein.

Verschieben nach vorne

Drei Objekte und vier Positionen

.-----------.-----------.-----------.
Objekte | a | b | c |
'-----------'-----------'-----------'

^ ^ ^
| ++ | ++ | ++ |
| --------> | --------> | --------> |
| | | |

Positionen Anfang Deckel

main.cpp

#include <initializer_list>
#include <iostream>
#include <iterator>
#include <ostream>
#include <string>

using namespace ::std::literals;

int main()

{ ::std::string s = "abc"s;
auto b = cbegin( s );
::std::cout << *b << '\n'; ++b;
::std::cout << *b << '\n'; ++b;
::std::cout << *b << '\n'; ++b; }

transcript
a
b
c

Verschieben nach hinten

Drei Objekte und vier Positionen

.-----------.-----------.-----------.
Objekte | a | b | c |
'-----------'-----------'-----------'

^ ^ ^
| -- | -- | -- |
| <-------- | <-------- | <-------- |
| | | |

Positionen Anfang Deckel

main.cpp

#include <initializer_list>
#include <iostream>
#include <iterator>
#include <ostream>
#include <string>

using namespace ::std::literals;

int main()

{ ::std::string s = "abc"s;
auto t = cend( s );
--t; ::std::cout << *t << '\n';
--t; ::std::cout << *t << '\n';
--t; ::std::cout << *t << '\n'; }

transcript
c
b
a

Zulässige Positionen

Eine Position eines Bereiches darf nur der Anfang jenes Bereichs sein, eine daraus mit »++« erhaltene Position, solange das Ende jenes Bereichs noch nicht erreicht wurde, oder der Deckel jenes Bereichs (oder eine daraus mit »--« erhaltene Position, solange der Anfang jenes Bereichs noch nicht erreicht wurde).

verboten sind Positionen „vor dem Anfang“: verboten: auto b = cbegin( s ); --b;

verboten sind Positionen „hinter dem Deckel“: verboten: auto t = cend( s ); ++t;

Der Deckel darf nicht dereferenziert werden.

verboten: auto t = cend( s ); *t;

Vergleiche mit dem Deckel

Nicht alle Positionen können in jede Richtung verschoben werden. Manche nur nach vorne, manche nur nach hinten. Dies kann vom Typ der Folge abhängen, auf die sie sich beziehen.

main.cpp

#include <iostream>
#include <ostream>
#include <string>
#include <iterator>
#include <initializer_list>

int main()
{ ::std::string const str{ "abc" };
auto p = cbegin( str );
::std::cout <<( p == cend( str ))<< *p << '\n'; ++p;
::std::cout <<( p == cend( str ))<< *p << '\n'; ++p;
::std::cout <<( p == cend( str ))<< *p << '\n'; ++p;
::std::cout <<( p == cend( str ))<< '\n'; }

::std::cout
0a
0b
0c
1

Schleifen

Aufwärtsschleifen

Bei Aufwärtsschleifen  wird nach  dem Schleifeninhalt inkrementiert.

main.cpp

#include <initializer_list>
#include <iostream>
#include <iterator>
#include <ostream>
#include <string>

using namespace ::std::literals;

int main()

{ ::std::string const s = "abc"s; auto const top = cend( s );
for( auto p = cbegin( s ); p != top; ++p )
::std::cout << *p << '\n'; }

Protokoll
a
b
c

Die Variable »top« verhindert einen eventuellen mehrfachen unnötigen Aufruf der Funktion »::std::cend« bei jedem Schleifendurchlauf.

Diese Regel kann man auch für Schleifen mit Zahlenwerten anwenden.

main.cpp

#include <initializer_list>
#include <iostream>
#include <iterator>
#include <ostream>
#include <string>

using namespace ::std::literals;

int main()

{ for( auto u = 0u; u != 3u; ++u )
::std::cout << u << '\n'; }

transcript
0
1
2

Abwärtsschleifen

Bei Abwärtsschleifen  wird vor  dem Schleifeninhalt inkrementiert. Es ist darauf zu achten, »p« nicht mehr zu dekrementieren, wenn es schon den Wert »cbegin( s )« hat. Daher nicht : »for( auto p = cend( s ); p-- != cbegin( s ); )«!

main.cpp

#include <initializer_list>
#include <iostream>
#include <iterator>
#include <ostream>
#include <string>

using namespace ::std::literals;

int main()

{ ::std::string const s = "abc"s; auto const first = cbegin( s );
for( auto p = cend( s ); p != first; )
{ --p; ::std::cout << *p << '\n'; }}

Protokoll
c
b
a

Diese Regel kann man auch für Schleifen mit Zahlenwerten anwenden, selber bei den schwierigen vorzeichenlosen Abwärtsschleifen.

main.cpp

#include <initializer_list>
#include <iostream>
#include <iterator>
#include <ostream>
#include <string>

using namespace ::std::literals;

int main()

{ for( auto u = 3u; u != 0; )
{ --u; ::std::cout << u << '\n'; }}

transcript
2
1
0

Zeiger als Iteratoren

Bereichsfunktionen akzeptieren auch Zeiger als Iteratoren.

Hier ist wieder »::std::cbegin« statt »cbegin« nötig!

main.cpp

#include <iostream>
#include <ostream>
#include <algorithm>

int main()
{ /* v */
int a[]{ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 };
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 */

::std::cout << ::std::distance( a, ::std::find( ::std::cbegin( a ), ::std::cend( a ), 22 )) << '\n'; }

::std::cout
11

End-Einfüger

»back_inserter( s )« ergibt einen Iterator zum Schreiben an das Ende des Strings »s«.

main.cpp

#include <iostream>
#include <ostream>
#include <string>

int main()
{ ::std::string s;
auto p = back_inserter( s );
::std::cout << '|' << s << "|\n";
*p++ = 'a'; // * und ++ koennen hier auch entfallen
*p++ = 'b'; // Wirkung ist wie s.push_back( 'b' )
*p++ = 'c';
::std::cout << '|' << s << "|\n"; }

::std::cout
abc

Kopieren

Eine Schreibiterator kann von »copy« genutzt werden, um dort den angegebenen Bereich hinzukopieren.

main.cpp

#include <iostream>
#include <ostream>
#include <string>
#include <algorithm>
#include <initializer_list>

int main()
{ ::std::string str{ "abc" };
::std::string t;
copy( cbegin( str ), cend( str ), back_inserter( t ));
::std::cout << t << "\n"; }

::std::cout
abc

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723720 stefan_ram:723720 Verschieben von Positionen in C++ Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723720, slrprddef723720, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/positionsverschieben_c++