Właśnie zorientowałem się, że w Visual Studio C++ 2010, basic_string::append (iter, iter)
, oczywiście, nie jest implementowane przez użycie std::copy
.Dlaczego basic_string :: append (iter, iter) wywołanie std :: copy?
Pierwsze pytanie:
Załóżmy teraz zaimplementować własny typ iteracyjnej, wraz ze zoptymalizowanym przeciążenia std::copy
dla mojego typu iteracyjnej w celu zapewnienia bardziej efektywnego kopiowanie blokowej. Czy istnieje sposób, aby uzyskać basic_string::append
, aby skorzystać z tej optymalizacji, oprócz przeciążania append
również?
Czy jest jakaś szansa, że basic_string::append (iter, iter)
nie kopiuje znaków?
Drugie pytanie (jako punkt wyjścia dla własnej implementacji):
jest następująca gwarancją ważna?
std::string t ("JohnB");
std::string s;
s.reserve (10);
std::copy (t.begin(), t.end(), s.begin());
s.push_back ('\0');
czy powinienem lepiej użyć back_inserter
? Jeśli używam numeru back_inserter
- w jaki sposób mogę uniknąć kopiowania według znaków?
Aby odpowiedzieć na twoje drugie pytanie: 'reserve()', po którym następuje 'copy()' jest zdecydowanie __nie ważne__. Wydrukuj 's.size()' po kopii, aby zobaczyć, dlaczego. – Blastfurnace
@Blastfurnace: Ale funkcja 'resize()', a następnie 'copy()' zadziała. –
Co powiesz na 'resize', po którym następuje' copy'? – JohnB