2016-12-07 48 views
1
#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结尾的字符串指针就足够了。但是istringstreamctor仅取std::string,而不是std::string_view(仅限于C++ 1z)作为它的参数。如何使istringstream更高效?

在这种情况下是否有解决方法使std::istringstream更有效?

+0

我不确定是否这是原因,但我怀疑这不被支持,因为内部存储是由'stringbuf'支持的,它不接受'string_view'(出于很好的理由)。 –

回答

2

你可以简单地分配在istringstream内部使用的缓冲:

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

这不复制字符串。请注意0​​想要char*不是const char*,但它实际上并没有修改字符串,因此在传递它之前,您可能会使用C字符串指针const_cast

+2

你的建议[具有实现定义的行为](http://stackoverflow.com/a/13059195/636019)。 – ildjarn