use*_*517 6 c++ stringstream c++11
在不使用boost的情况下,从字符串流中提取一组字符的正确c ++ 11方法是什么?
如果可能的话,我想在没有复制的情况下这样做,因为使用它的地方是关键数据循环.但是,似乎std :: string不允许直接访问数据.
例如,下面的代码执行字符串流中的子字符串副本:
inline std::string left(std::stringstream ss, uint32_t count) {
char* buffer = new char[count];
ss.get(buffer, count);
std::string str(buffer); // Second copy performed here
delete buffer;
return str;
}
Run Code Online (Sandbox Code Playgroud)
我的理解是矢量初始化每个角色,所以我想避免这种情况.
此外,这需要传递给一个接受const char*的函数,所以现在运行后我被迫做一个.c_str().这也是副本吗?
能够传回一个const char*会很好,但这似乎违背了"适当的"c ++ 11风格.
要了解我想要做什么,这里"有效"我想用它:
fprintf( stderr, "Data: [%s]...", left(ststream, 255) );
Run Code Online (Sandbox Code Playgroud)
但是c ++ 11强制:
fprintf( stderr, "Data: [%s]...", left(str_data, 255).c_str() );
Run Code Online (Sandbox Code Playgroud)
我在这里制作了多少份该字符串?
如何将它减少到只有一个副本的字符串流?
您可以使用此链接中描述的内容:如何直接从char*数组创建std :: string而不进行复制?
基本上,创建一个字符串,使用传递给函数的大小调用字符串上的resize()方法,然后将指针传递给stringstring.get()方法的字符串的第一个字符.您最终只能获得一份副本.
inline std::string left(std::stringstream& ss, uint32_t count) {
std::string str;
str.resize(count);
ss.get(&str[0], count);
return str;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5875 次 |
| 最近记录: |