Advanced   Java   Services STL string


STL string

Eine vollständige Dokumentation der Klasse string findet man auf den beiden Referenzseiten

http://www.cplusplus.com/reference/string/string/string/

http://en.cppreference.com/w/cpp/string/basic_string

Die Klasse string kapselt einen klassischen c-String und stellt eine Vielzahl von Methoden zur Stringbearbeitung bereit. Sie wird hier mit einer Reihe von Beispielen vorgestellt.


include und Namespace
#include <string>
using namespace std;

Konstruktoreen
Konstruktoren
string()
 
Constructs an empty string, with a length of zero characters.
string (const string& str);
 
Kopierkonstruktor.
string (const string& str, size_t pos, size_t len = npos)
 
Substring constructor. Copies the portion of str that begins at the character position pos and spans len characters (or until the end of str, if either str is too short or if len is string::npos)
string(const char* s)
 
Creates a string from a c-string (Copies the null-terminated character sequence (C-string) pointed by s)
string(const char* s, size_t n)
 
Creates a string from a char-array. Copies the first n characters from the array of characters pointed by s
string(size_t n, char c)
 
Fill constructor. Fills the string with n consecutive copies of character c.
string(InputIterator first, InputIterator last)
 
Range constructor. Creates a string with a copy of the sequence of characters in the range [first,last)
string(initializer_list<char> il)
 
initializer list. Creates a string with a copy of each of the characters in il, in the same order.
string(string&& str) noexcept
 
move constructor. Acquires the contents of str.
str is left in an unspecified but valid state.

Zugriff auf Stringelemente und einfache Abfragemethoden

Vorgestellt werden: Der Indexoperator [], und die Methoden at(), c_str(), empty(), length(), size(), max_size(), capacity(), clear().

void elementAccess()
{
   string satchmo("louis armstrong");
   satchmo[0] = 'L';
   satchmo.at(6) = 'A';  // gibt referenz zurück !
   cout << satchmo << endl;
   const char* cstr = satchmo.c_str();
   cout << cstr << endl;
   cout << satchmo[26] << endl;  // wirft keine exception
   cout << satchmo.at(26) << endl;  // throws std::out_of_range if pos >= size().

   if( satchmo.empty()) cout << "leerer string" << endl;
   cout << "length = " << satchmo.length() << endl;       // length = 15
   cout << "size   = " << satchmo.size() << endl;         // size   = 15
   cout << "max_size   = " << satchmo.max_size() << endl; // max_size   = 1073741820
   cout << "capacity   = " << satchmo.capacity() << endl; // capacity   = 15
   satchmo = satchmo + " tp";  // + überladen
   cout << "capacity   = " << satchmo.capacity() << endl; // capacity   = 30

   satchmo.clear();
   cout << "after clear: " << satchmo << endl;
   cout << "size = " << satchmo.size() << endl;  //  0
   cout << "length = " << satchmo.length() << endl;
   cout << "capacity = " << satchmo.capacity() << endl;  // 30
}

Iteratoren

Es gibt die folgenden Iteratoren

string::iterator
string::const_iterator
string::reverse_iterator
string::const_reverse_iterator

Klassische for-Schleife
for (string::iterator iter = duke.begin(); iter != duke.end(); ++iter)   //
    cout << *iter;
cout << endl;

for (auto iter = duke.begin(); iter != duke.end(); ++iter)   //
    cout << *iter;
cout << endl;

for (string::reverse_iterator iter = duke.rbegin(); iter != duke.rend(); ++iter)
    cout << *iter;
cout << endl;

for (auto iter = duke.rbegin(); iter != duke.rend(); ++iter)
{
   *iter = std::toupper(*iter);
    cout << *iter;
}
cout << endl;

for(string::const_iterator citer = duke.begin(); citer != duke.end(); ++citer)
    cout << *citer;
cout << endl;

for-each Schleife und for_each Funktion

Der for_each Funktion kann als letztere Parameter entweder ein Funktionspointer oder ein Lambda-ausdruck übergeben werden, oder aber auch ein Objekt einer Klasse, die einen passenden function-call Operator enthält. Das folgenden Beispiel zeigt das mit der Funktion action() und mit dem Objekt myObject eines anonymen structs.

void iteratoren_for_each()
{
   string duke("duke ellington");

   // for-each Schleife
   for(char ch : duke)
   {
      cout << ch;
   }
   cout << endl;

   // for_each Funktion, übergabe eines Funktionspointers
   for_each(duke.begin(), duke.end(), action);
   std::cout << '\n';

   // for_each Funktion mit Lambda-ausdruck
   for_each(duke.begin(), duke.end(), [](char ch) {ch = std::toupper(ch) ; cout << ch;} );
   std::cout << '\n';

   // for_each Funktion mit Objektübergabe
   for_each(duke.begin(), duke.end(), myObject );
   std::cout << '\n';
}

void action(char ch)
{
   cout << ch;
}

struct
{
   // function call operator
   void operator()(char ch)
   {
      std::cout << ch;
   }
} myObject;  // Objekt einer anonymen Klasse


Suchen, Finden, Ersetzen, Löschen

Vorgestellt werden die Methoden find(), find_first_of(), find_last_of(), replace(), erase(), max_size(), capacity(), clear().

void beispiel1()
{
   // string objekte haben kein \0 am Ende: Josuttis 474 !
   string s1 = "bild.jpg";
   cout << s1 << endl; // 4
   string::size_type pos = s1.find('.');
   // ist entweder unsigned int oder unsigned long, auf diese weise wird maschinenunabhängigkeit erreicht
   // immer diese Typen benützen
   cout << "Punkt ist an der Position " << pos << endl; // 4
   string ext = s1.substr(pos+1);
   cout << "Dateiendung ist " << ext << endl; // 4
   string replaced = s1.replace (pos+1, 3, "png");
   cout << "Neuer Dateiname: " << replaced << endl;

   size_t posx = s1.find('x');
   cout << "find liefert : " << posx << endl; // 4294967295 = 2^32 - 1
   cout << "string::npos = " << string::npos << endl; // 4294967295
   cout << "s.max_size() = " << s1.max_size() << endl; // 1073741820 = 2^30 - 4
   // es gibt einen speziellen Wert, falls die Suche erfolglos ist  string::npos
   // Dieser Wert liegt über dem, den max_size() liefert
   if (posx == string::npos)
   {
      cout << "Zeichen " << 'x' << " kommt nicht vor" << endl;
   }
}
void beispiel2()
{
   string s2 = "C:\\eclipse-workspaces\\cdt\\C++_04_string_2\\src\\C++_04_string_2.cpp\\";
   cout << s2 << endl;

   size_t firstpos = s2.find_first_of('\\');
   size_t lastpos = s2.find_last_of('\\');
   cout << "Erster Backslash an Position  " <<firstpos << endl;  // 4
   cout << "Letzter Backslash an Position " << lastpos << endl;  // 65
   cout << endl;  //

   cout << "Suche ab der Position 100" << endl;
   size_t slashpos = s2.find('\\', 100);
   if ( slashpos == string::npos)
      cout << "Zeichen nicht gefunden\n" << endl;
   // kein Fehler wenn der zweite Parameter > Stringlänge !
   // es wird einfach string::npos geliefert

   cout << "Backsslash an den Positionen " << endl;
   for (size_t spos = 0, pos = 0 ; spos < s2.length() ; )
   {
      pos = s2.find('\\', spos);
      if (pos!=string::npos)
      {
         cout << pos << " " ;
         spos = pos+1;
      }
      else
         break;
   }
   cout << endl;
   //string& erase (size_t pos = 0, size_t len = npos);
   // npos heißt bis zum Ende
   cout << "Lösche letztes Zeichen" << endl;
   string s3 = s2.erase(s2.length()-1,1);
   cout << s3 << endl;
}