如何使istringstream更加高效?

3
#include <sstream>

using namespace std;

const char* GetHugeString();

int main()
{
    const char* p = GetHugeString();

    //
    // Below will copy the huge string into a std::string object!
    // 
    istringstream sstrm{p}; 

    return {};
}
istringstream不需要复制巨大的字符串;只需要一个以null结尾的字符串指针即可。但是istringstream的构造函数只接受std::string作为参数,而不是std::string_view(仅在c++1z中可用)。

有没有一种解决方法可以使std::istringstream在这种情况下更有效率?


我不确定这是否是原因,但我怀疑这不受支持,因为内部存储由stringbuf支持,而它不接受string_view(有充分的理由)。 - Collin Dauphinee
1个回答

3

您可以直接分配内部使用的缓冲区到istringstream中:

istringstream stream;
stream.rdbuf()->pubsetbuf(p, strlen(p));

这并不是将字符串复制一份。请注意,pubsetbuf() 需要的是 char* 而不是 const char*,但它实际上并没有修改字符串,因此您可以在传递指针之前使用 const_cast 将 C 字符串指针转换为非常量指针。


4
你所建议的具有实现定义的行为 - ildjarn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接