std::move zwischen std::string und std::vector<unsigned char>
Arbeite ich mit 2 Bibliotheken. Man nimmt und gibt zurück std::string
s, während die andere verwendet std::vector<unsigned char>
s.
Wäre es gut, wenn ich könnte stehlen die zugrunde liegenden arrays von std::string
und std::vector<unsigned char>
und in der Lage sein, um Sie zu bewegen, in jeden anderen ohne übermäßige kopieren.
ATM verwende ich etwas wie:
const unsigned char* raw_memory =
reinterpret_cast<const unsigned char*>(string_value.c_str()),
std::vector<unsigned char>(raw_memory, raw_memory + string_value.size();
Ist und die andere Art:
std::string(
reinterpret_cast<const char*>(&vector_value[0]),
vector_value.size());
Es wäre weit besser in der Lage sein zu definieren:
std::string move_into(std::vector<unsigned char>&&);
std::vector<unsigned char> move_into(std::string&&);
InformationsquelleAutor der Frage genjix | 2012-05-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist dies nicht möglich.
Den
vector
undstring
Klasse nicht liefern, Weg zu stehlen, nichts anderes alsvector
oderstring
bzw.. Sie sind nicht gedacht, um exchange-Inhalte.Das problem, das Problem ist, dass
vector
undstring
können zu sehr unterschiedlichen zugrunde liegenden Darstellungen. In der Regel in den gcc zum Beispielstring
verwenden Sie den ältlichen COW (Copy-On-Write) "Optimierung", die weit von der typischenvector
Vertretung (in der Regel nur einen dreifach-Zeiger/size_t Attribute).Wenn Sie sind den Umgang mit raw-bytes, die Schuld der Bibliothek, die beschlossen, Sie in
string
- und umgestalten, wenn Sie können.Sonst: kopieren. Die
reinterpret_cast
sollte nicht notwendig sein, weilchar
undunsigned char
haben impliziten Typumwandlungen zwischen Ihnen (und jetztchar
ist oftunsigned
standardmäßig).InformationsquelleAutor der Antwort Matthieu M.
Können Sie die Initialisierung über Iteratoren. Haben Sie einen Blick hier
BEARBEITEN: einfügen des Codes, so dass Sie nicht haben zu gehen zu ideone. Immer noch verlassen den link, so dass Sie spielen können, um mit dem code
InformationsquelleAutor der Antwort Ivaylo Strandjev