Traditionelle Schleifen mit Iteratoren in C++
Nicht-konstante Indikatoren (Schreibindikatoren)
Die von uns oben verwendeten „konstanten“ Indikatoren erlauben keinen Schreibzugriffe der Art wie »*p=«, dafür sind „nicht-konstante“ Indikator zu verwenden, die mit »begin« und »end« erhalten werden.
main.cpp
#include <initializer_list>
#include <iostream>
#include <iterator>
#include <ostream>
#include <string>using namespace ::std::literals;
int main()
{ ::std::string s = "pqr"s;
auto p = begin( s );
*p = 'x';
::std::cout << s << '\n'; }transcript
xqr
»*«
Der Operator »*« ergibt das Objekt an der durch den Indikator angegebenen Position.
Der Wert an der Position einer Indikators »p« ist »*p«.
main.cpp
#include <iostream>
#include <ostream>
#include <string>
#include <iterator>
#include <initializer_list>using namespace ::std::literals;
int main()
{ ::std::string const str{ "abc"s };
auto const s0 = cbegin( str );
::std::cout << *s0 << '\n'; }::std::cout
a
main.cpp
#include <iostream>
#include <ostream>
#include <string>
#include <iterator>
#include <initializer_list>using namespace ::std::literals;
int main()
{ ::std::string s = "pqr"s;
auto p = cbegin( s );
while( p != cend( s ))::std::cout << *p++ << '\n'; }transcript
p
q
r
Bei fundamentalen Typen hilft ADL nicht, und man muß wieder »::std::« verwenden.
main.cpp
#include <iostream>
#include <ostream>
#include <string>
#include <iterator>
#include <initializer_list>using namespace ::std::literals;
int main()
{ int a[]{ 1, 2, 3 };
auto p = ::std::cbegin( a );
while( p != ::std::cend( a ))::std::cout << *p++ << '\n'; }transcript
1
2
3
Indikatorenwertige Funktionen als Elementfunktionen
Weitere Notizen und Beispiele
main.cpp
#include <iostream>
#include <ostream>
#include <iterator>
int main()
{ int a[]{ 1, 2, 3 };
auto p = cbegin( a );
while( p != cend( a ))::std::cout << *p++ << '\n'; }
::std::cout
1
2
3main.cpp
#include <iostream>
#include <ostream>
#include <iterator>
int main()
{ int a[]{ 1, 2, 3 };
auto p = cbegin( a );
while( p != cend( a ))::std::cout << *p++ << '\n'; }
::std::cout
1
2
3main.cpp
#include <iostream>
#include <ostream>
#include <string>
#include <iterator>
#include <initializer_list>using namespace ::std::literals;
int main()
{ ::std::string str{ "abc"s };
auto const beg = cbegin( str );
auto const top = cend( str );
for( auto p = beg; p != top; ++p )::std::cout << *p;
::std::cout << '\n'; }::std::cout
abc
main.cpp
#include <iostream>
#include <ostream>
#include <string>
#include <iterator>
#include <initializer_list>using namespace ::std::literals;
int main()
{ ::std::string str{ "abc"s };
::std::string::iterator const beg = cbegin( str );
::std::string::iterator const top = cend( str );
for( ::std::string::iterator p = beg; p != top; ++p )::std::cout << *p;
::std::cout << '\n'; }::std::cout
abc
main.cpp
#include <iostream>
#include <ostream>
#include <string>
#include <iterator>
#include <initializer_list>using namespace ::std::literals;
int main()
{ ::std::string str{ "abc"s };
for( ::std::string::value_type ch : str )::std::cout << ch; ::std::cout << '\n';
for( auto ch : str )::std::cout << ch; ::std::cout << '\n'; }::std::cout
abc
abc
Kategorien
Man unterscheidet verschiedene Kategorien von Indikatoren:
Manche lassen sich mit ++ vorwärts bewegen (Vorwärts-Indikatoren).
Manche lassen sich mit -- rückwärts bewegen (Rückwärts-Indikatoren).
Manche sind Vorwärts-Indikatoren und Rückwärts-Indikatoren gleichzeitig (bidirektionale Indikatoren)
Wenn ein Indikator eine Position P angibt, so sagen wir auch, er sein ein Indikator jener Position P oder er indiziere jene Position.
/ˈɪtəˌret ɚ/
Lat. iterum („wiederholt“)