std::string in int umwandeln: Der Kampf zwischen Leistung und Komfort in C++

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Die ewige Frage "std::string in int"

\n\n

Hallo, Programmierkollege! Wenn du jemals in C++ einen Konfigurationsparser geschrieben, Benutzereingaben verarbeitet oder Zahlen aus einer CSV-Datei extrahiert hast, bist du sicherlich auf die Aufgabe gestoßen: "Wie verwandle ich einen gewöhnlichen String (std::string) in eine ganze Zahl (int)?" Das klingt einfacher, als es ist. Ein Blick auf Stack Overflow zeigt tausende Stimmen und Dutzende Antwortvarianten. Warum? Weil sich hinter dieser einfachen Frage eine ganze Welt von Kompromissen zwischen Komfort, Sicherheit und Leistung verbirgt.

\n\n

In diesem Artikel geben wir nicht nur eine trockene Antwort. Wir veranstalten einen echten Kampf zwischen den wichtigsten Konvertierungsmethoden: std::stoi, std::from_chars (C++17), std::stringstream, dem guten alten atoi und schreiben sogar unser eigenes Rad. Du erfährst, welche Methode du für einen hochbelasteten Server wählen solltest und welche für einen schnellen Prototypen. Los geht's!

\n\n

Methode 1: Der Klassiker — std::stoi (C++11)

\n\n

Seit C++11 gibt es in der Standardbibliothek die elegante Funktion std::stoi. Sie ist einfach, lesbar und wirft bei Fehlern Ausnahmen. Das ist die Wahl von 90 % der Entwickler für alltägliche Aufgaben.

\n\n
#include <iostream>\n#include <string>\n\nint main() {\n    std::string number_str = "12345";\n    try {\n        int value = std::stoi(number_str);\n        std::cout << "Zahl: " << value << std::endl;\n    } catch (const std::invalid_argument& e) {\n        std::cerr << "Fehler: Der String enthält keine Zahl!" << std::endl;\n    } catch (const std::out_of_range& e) {\n        std::cerr << "Fehler: Die Zahl liegt außerhalb des int-Bereichs!" << std::endl;\n    }\n    return 0;\n}
\n\n

Vor- und Nachteile von std::stoi

\n
    \n
  • Vorteile: Einfachheit, Unterstützung von Locales (erkennt Kommas als Trennzeichen), automatische Fehlerbehandlung durch Ausnahmen.
  • \n
  • Nachteile: Ausnahmen sind teuer. Wenn du Millionen von Zahlen in einer Schleife parst, kann try-catch den Code erheblich verlangsamen.
  • \n
\n\n

Methode 2: Schneller als der Wind — std::from_chars (C++17)

\n\n

Wenn du eine High-Load-Anwendung schreibst, bei der jede Nanosekunde zählt, dann ist std::from_chars dein Held. Diese Funktion reserviert keinen Speicher, wirft keine Ausnahmen und ist unabhängig von der Locale. Sie wandelt einfach Zeichen in eine Zahl um und gibt einen Zeiger auf die Stoppstelle zurück.

\n\n
#include <iostream>\n#include <charconv>\n#include <string>\n#include <system_error>\n\nint main() {\n    std::string number_str = "98765";\n    int value = 0;\n    auto [ptr, ec] = std::from_chars(number_str.data(), \n                                      number_str.data() + number_str.size(), \n                                      value);\n    if (ec == std::errc()) {\n        std::cout << "Zahl: " << value << std::endl;\n    } else {\n        std::cerr << "Konvertierungsfehler!" << std::endl;\n    }\n    return 0;\n}
\n\n

Warum ist from_chars der König der Leistung?

\n
    \n
  • Zero-Overhead: Keine Ausnahmen, keine versteckten Allokationen.
  • \n
  • Lokalisierung deaktiviert: Keine Zeitverschwendung durch Überprüfung von Dezimaltrennzeichen.
  • \n
  • Gibt den Rest des Strings zurück: Ideal zum Parsen von Spalten in CSV.
  • \n
\n

Laut Benchmarks kann from_chars 2-10 mal schneller sein als stoi, insbesondere bei kurzen Strings.

\n\n

Methode 3: Schwere Artillerie — std::stringstream

\n\n

Viele Anfänger verwenden std::stringstream zur Konvertierung. Es ist ein mächtiges Werkzeug, aber für die Aufgabe "String in Zahl" ist es überdimensioniert, wie ein Panzer für die Fahrt zum Bäcker.

\n\n
#include <sstream>\n#include <string>\n#                

Blogs

Buchempfehlungen