2016-12-07 49 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