Definiert die C ++ - Standardbibliothek diese Funktion oder muss ich auf Boost zurückgreifen?
Ich suchte im Internet und konnte nichts außer Boost finden, aber ich dachte, ich sollte hier besser fragen.
Definiert die C ++ - Standardbibliothek diese Funktion oder muss ich auf Boost zurückgreifen?
Ich suchte im Internet und konnte nichts außer Boost finden, aber ich dachte, ich sollte hier besser fragen.
Antworten:
Nur teilweise.
C ++ 11 <string>hat std::to_stringfür die eingebauten Typen:
[n3290: 21.5/7]:string to_string(int val); string to_string(unsigned val); string to_string(long val); string to_string(unsigned long val); string to_string(long long val); string to_string(unsigned long long val); string to_string(float val); string to_string(double val); string to_string(long double val);Rückgabewert : Jede Funktion gibt einen
stringGegenstand hält die Zeichendarstellung des Wertes seines Arguments , das durch den Aufruf erzeugt wird , würdesprintf(buf, fmt, val)mit einem Format - Spezifizierer aus"%d","%u","%ld","%lu","%lld","%llu","%f","%f", oder"%Lf"jeweils gegebenenbufbezeichnet einen internen Zeichenpuffer mit ausreichender Größe.
Es gibt auch die folgenden, die umgekehrt sind:
[n3290: 21.5/1, 21.5/4]:int stoi(const string& str, size_t *idx = 0, int base = 10); long stol(const string& str, size_t *idx = 0, int base = 10); unsigned long stoul(const string& str, size_t *idx = 0, int base = 10); long long stoll(const string& str, size_t *idx = 0, int base = 10); unsigned long long stoull(const string& str, size_t *idx = 0, int base = 10); float stof(const string& str, size_t *idx = 0); double stod(const string& str, size_t *idx = 0); long double stold(const string& str, size_t *idx = 0);
Es gibt jedoch nichts Generisches, das Sie verwenden können (zumindest nicht bis TR2 , vielleicht!), Und überhaupt nichts in C ++ 03.
stoiund Freunde :)
Nein, auch in C ++ 11 nicht, aber es wird vorgeschlagen, in Technical Report 2, den nächsten Satz von Standardbibliothekserweiterungen, aufgenommen zu werden.
Es gibt keinen std :: lexical_cast, aber mit stringstreams können Sie immer etwas Ähnliches tun :
template <typename T>
T lexical_cast(const std::string& str)
{
T var;
std::istringstream iss;
iss.str(str);
iss >> var;
// deal with any error bits that may have been set on the stream
return var;
}
lexical_cast<string>(string)dies verwenden, wird nur das erste Wort zurückgegeben, nicht das, was Sie übergeben. (Sie können es in einer Vorlagenfunktion oder etwas anderem verwenden, nicht direkt.) Etwas, auf das Sie achten müssen.
issstatisch gemacht wird
Nein, es ist nur eine reine Boost-Sache.
Wenn Sie keinen Boost möchten, implementiert eine Lightweight-Bibliothek namens fmt Folgendes:
// Works with all the C++11 features and AFAIK faster then boost or standard c++11
std::string string_num = fmt::format_int(123456789).str(); // or .c_str()
Weitere Beispiele von der offiziellen Seite .
Zugriff auf Argumente nach Position:
format("{0}, {1}, {2}", 'a', 'b', 'c');
// Result: "a, b, c"
format("{}, {}, {}", 'a', 'b', 'c');
// Result: "a, b, c"
format("{2}, {1}, {0}", 'a', 'b', 'c');
// Result: "c, b, a"
format("{0}{1}{0}", "abra", "cad"); // arguments' indices can be repeated
// Result: "abracadabra"
Text ausrichten und Breite angeben:
format("{:<30}", "left aligned");
// Result: "left aligned "
format("{:>30}", "right aligned");
// Result: " right aligned"
format("{:^30}", "centered");
// Result: " centered "
format("{:*^30}", "centered"); // use '*' as a fill char
// Result: "***********centered***********"
Ersetzen von% + f,% -f und% f und Angeben eines Vorzeichens:
format("{:+f}; {:+f}", 3.14, -3.14); // show it always
// Result: "+3.140000; -3.140000"
format("{: f}; {: f}", 3.14, -3.14); // show a space for positive numbers
// Result: " 3.140000; -3.140000"
format("{:-f}; {:-f}", 3.14, -3.14); // show only the minus -- same as '{:f}; {:f}'
// Result: "3.140000; -3.140000"
Ersetzen von% x und% o und Konvertieren des Werts in verschiedene Basen:
format("int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}", 42);
// Result: "int: 42; hex: 2a; oct: 52; bin: 101010"
// with 0x or 0 or 0b as prefix:
format("int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}", 42);
// Result: "int: 42; hex: 0x2a; oct: 052; bin: 0b101010"
fmtBibliothek sehr und möchte, dass ihre Nutzung gefördert wird. fmtDie Konvertierung in Zeichenfolgen wird jedoch nur durchgeführt . (Jetzt ist es das besser als jede andere C ++ Bibliothek , die ich gesehen habe.) fmtNicht tun , die aus String Konvertierung durchgeführt durch lexical_cast oder std :: stoxyz Funktionen.