std::string nach std::vector<char> umwandeln
-
Welche Methode ist schneller um einen std::string nach std::vector<char> umzuwandeln?
std::vector<char> v(str.begin(), str.end());oder
std::vector<char> v(str.length()); v.insert(v.begin(), str.begin(), str.end());Kann bei der ersten Variante sofort der benötigte Speicherplatz ermittelt werden?
-
insert schrieb:
Kann bei der ersten Variante sofort der benötigte Speicherplatz ermittelt werden?
ja, eigentlich schon. Weiß aber nicht, obs das auch tut.
-
Wenn ma bei VS8 den Konstruktor mit der Iteratorrange weiterverfolgt landet man irgendwann an folgender Codestelle:
size_type _Count = 0; _Distance(_First, _Last, _Count); size_type _Capacity = capacity(); if (_Count == 0) ; else if (max_size() - size() < _Count) _Xlen(); // result too long else if (_Capacity < size() + _Count) { // not enough room, reallocate _Capacity = max_size() - _Capacity / 2 < _Capacity ? 0 : _Capacity + _Capacity / 2; // try to grow by 50% if (_Capacity < size() + _Count) _Capacity = size() + _Count; pointer _Newvec = this->_Alval.allocate(_Capacity); pointer _Ptr = _Newvec;wobei _Distance durch simples inkrementieren von _First die Anzahl der Elemente besorgt.
Da die andere Variante letztendlich an genau der gleichen Codestelle landet,dürfte die erste Variante wohl geringfügig schneller sein.
Ob das jetzt bei jeder Implementierung so ist.....keine Ahnung.PS:Noch nen Tacken schneller sollte ne Kombination aus ner vector Konstruktion mit str.length() und std::copy sein(length arbeitet in konstanter Zeit und copy führt ja(in den meisten Implementierungen) keinerlei Größenüberprüfungen durch.Somit sparst du im Vergleich zu der ersten Variante mindestens den _Distance kram ein).
Gruss Spacelord
-
Spacelord schrieb:
wobei _Distance durch simples inkrementieren von _First die Anzahl der Elemente besorgt.
Bist du dir ganz sicher? Nach meinem Wissen schaltet _Distance() je nach Iterator-Typ zwischen dem Hochzählen (alle "einfachen" Iteratoren) und "Count=Last-First;" (Random Access Iteratoren) um.
(aber da solltest du dir die Implementation genauer ansehen)
-
CStoll schrieb:
Spacelord schrieb:
wobei _Distance durch simples inkrementieren von _First die Anzahl der Elemente besorgt.
Bist du dir ganz sicher? Nach meinem Wissen schaltet _Distance() je nach Iterator-Typ zwischen dem Hochzählen (alle "einfachen" Iteratoren) und "Count=Last-First;" (Random Access Iteratoren) um.
Ich kenne _Distance zwar nicht, aber zumindest für std::distance ist diesen Verhalten garantiert. Also für Random-Access-Iteratoren (insbesondere auch Pointer) ist std::distance eine O(1)-Operation. Für alle anderen Iterator-Typen ist std::distance linear.
-
Da habt ihr beiden Recht.
Bin jetzt mal mit dem Debugger durchgelaufen und _Distance ist für Random Access Iteratoren (mit Last-First) überladen.
Mein Fehler.
Gruß Spacelord