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_string
fü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
string
Gegenstand 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 gegebenenbuf
bezeichnet 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.
stoi
und 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.
iss
statisch 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"
fmt
Bibliothek sehr und möchte, dass ihre Nutzung gefördert wird. fmt
Die Konvertierung in Zeichenfolgen wird jedoch nur durchgeführt . (Jetzt ist es das besser als jede andere C ++ Bibliothek , die ich gesehen habe.) fmt
Nicht tun , die aus String Konvertierung durchgeführt durch lexical_cast oder std :: stoxyz Funktionen.