Наиболее общим способом, вероятно, будет ответ, использующий istreambuf_iterator
:
std::string s( (std::istreambuf_iterator<char>( source )),
(std::istreambuf_iterator<char>()) );
Хотя точная производительность очень зависит от реализации, маловероятно, что это самое быстрое решение.
Интересной альтернативой будет:
std::istringstream tmp;
tmp << source.rdbuf();
std::string s( tmp.str() );
Это может быть очень быстро, , если , реализация хорошо справится с operator<<
, который вы используете, ив том, как растет строка в пределах istringstream
.Однако некоторые более ранние реализации (и, возможно, некоторые более поздние) были очень плохими в этом.
Как правило, производительность при использовании std::string
будет зависеть от того, насколько эффективна реализация для роста строки;реализация не может определить, насколько велика она должна быть изначально.Возможно, вы захотите сравнить первый алгоритм, используя тот же код с std::vector<char>
вместо std::string
, или если вы можете правильно оценить максимальный размер, используя reserve
или что-то вроде:
std::string s( expectedSize, '\0' );
std::copy( std::istreambuf_iterator<char>( source ),
std::istreambuf_iterator<char>(),
s.begin() );
memcpy
не может читать из файла, и с хорошим компилятором не будет так быстро, как при использовании std::copy
(с теми же типами данных).
Я склонен использовать второе решение,выше, с <<
на rdbuf()
, но это частично по историческим причинам;Я привык делать это (используя istrstream
) до того, как STL был добавлен в стандартную библиотеку.В этом отношении вы можете поэкспериментировать с istrstream
и предварительно выделенным буфером (предположим, вы можете найти подходящий размер для буфера).