最通用的方式可能是使用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
速度不会比memcpy
快。
我倾向于使用第二种解决方案,即在rdbuf()
上使用<<
,但这部分是出于历史原因; 我习惯于在标准库中添加STL之前这样做(使用istrstream
)。 说到这一点,您可能想尝试使用istrstream
和预分配的缓冲区(假设您可以找到适当的缓冲区大小)。