Std::string std::array?
Was ist der empfohlene Weg, um zu konvertieren eine Zeichenfolge in ein array? Ich bin auf der Suche nach etwas wie:
template<class T, size_t N, class V>
std::array<T, N> to_array(const V& v)
{
assert(v.size() == N);
std::array<T, N> d;
std::copy(v.begin(), v.end(), d.data());
return d;
}
Macht C++11 oder-Boost etwas wie dies? Wie sehen andere das? Scheint dumm, mit kopieren/einfügen diese Funktion mich jedes mal wenn ich es in ein Projekt.
- Erm, steckte es in einen header?
- Und Sie müssen diese für...?
- Ich habe eine Karte mit über 1 Millionen 20 (oder 32) byte-Schlüssel, und ich möchte vermeiden die zusätzlichen Zuweisungen und indirections erforderlich, die von std::string
- std::string ist so effizient, wie std::vector - hast du Profil und sah, dass es ein problem ist?
- Dies ist über std::array, nicht std::vector.
- Es sieht einfach nicht, dass ist nützlich, wenn Sie wissen, dass Ihre Daten von 20 oder 32 Byte lang zur compile-Zeit, warum sind Sie vorbei, es durch einen string?
- Wenn Ihr string-Längen sind keine Feste Größe (unter 32 bytes), die Sie hinzufügen möchten, null, nachdem das Letzte Zeichen im array, also d[v. size()] = 0;
d[v.size()]
ist eine out-of-bounds Zugriff. Die strings haben, die genaue Größe, es gibt eine Behauptung zu dokumentieren, dass.- Datenbank/Benutzer-input, so habe ich eine Kopie in ein array zu einem bestimmten Zeitpunkt.
- Nein, es ist nicht. Er sagte: if (v. size() < d....size()) d[v. size] = 0
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint in Ordnung. Es ist nicht so eine Sache, die in C++11, und ich glaube nicht, dass es ein in Steigern entweder. Wenn Sie nicht möchten, fügen Sie diese alle über den Ort, Sie können einfach nur legte es in eine Kopfzeile und eine
#include
dass.Einfach anrufen:
ist Die Art und Weise zur Konvertierung einer Zeichenfolge in ein array. Ich sehe keinen Vorteil, wickeln diese in ein spezielles "utility" - Funktion.
Zusätzlich, es sei denn der compiler optimiert es die Leistung kann sich verschlechtern, mit der Sie Ihre Funktion: die Daten werden kopiert zweiten mal bei der Rückkehr das array.
Das ist in Ordnung, vielleicht mit einer kleinen Modifikation in C++11.
So, wenn Sie entfernen die Behauptung, diese Funktion würde funktionieren, auch wenn v ist ein raw array.
using std::begin; using std::end; std::copy(begin(v),end(v),begin(d));
using std::begin; using std::end;
macht dieto_array
wirklich generisch. Wenn Siestd::begin(v)
sind Sie verhindert, dass Ihre containerT
überschreibenbegin()
. Bottom line, müssen Sie die zusätzliche Zeile zu lassen, Koenig der Auflösung zu tun, was es tun soll!Wenn Sie wirklich wollen nur konvertieren string, um ein array handelt, verwenden Sie einfach
.c_str()
(und die Arbeit aufchar*
). Es ist nicht genauarray<>
aber Ihre Anforderungen anpassen können.