6

当我们必须使用字符串操作时,std::string 和 std::stringbuf 之间是否存在显着的性能差异,如果是,为什么。

更一般地说,什么时候最好使用 std::stringbuf 而不是 std::string ?

4

3 回答 3

6

Astd::stringbuf在内部使用字符串来缓冲数据,因此它可能会慢一些。我认为差异不会很大,因为它基本上只是授权。不过,为了确保您必须运行一些性能测试。

std::stringbuf当您希望 IO-stream 使用字符串作为缓冲区(如std::stringstreamstd::stringbuf默认使用 a )时很有用。

于 2012-04-25T09:44:33.393 回答
3

首先,astd::stringbuf不一定(甚至通常)使用 anstd::string作为其内部存储。例如,该标准描述了std::string如下的初始化:

构造类 basic_stringbuf 的对象...然后将 str 的内容复制到 basic_stringbuf 底层字符序列 [...]

注意措辞:“字符序列”——至少对我来说,这似乎非常小心,以避免说(甚至暗示)内容应该存储在实际的字符串中。

过去,我认为效率可能是一个红鲱鱼。它们都是相当薄的包装器,用于管理动态分配的某种字符序列的缓冲区。功能上有很大的不同(例如,string在字符串中间有很多搜索和插入/删除,而stringbuf. stringbuf鉴于其目的,在诸如 a 之类的东西之上实现可能是有意义的std::deque,以优化末端插入/删除的(通常)路径,但这对于大多数用途来说可能是微不足道的。

如果我这样做,我可能最担心的stringbuf是可能只与支持。stringstreamstringstream

于 2012-04-25T18:14:50.793 回答
0

std::stringbuf扩展std::string容器,用于读取和写入std::string.

std::string通常,和之间没有显着的性能差异std::stringbuf

因为std::streambuf<- std::stringbuf,都是因为:

typedef basic_stringbuf<char> stringbuf;    
typedef basic_string<char> string;

阅读本文了解更多详情。

于 2014-12-04T15:04:45.087 回答