如何在没有副本的情况下从字符串流中获取字符?

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)
  1. 我应该根据c ++ 11使用char*buffer吗?
  2. 如何绕过制作第二份副本?

我的理解是矢量初始化每个角色,所以我想避免这种情况.

此外,这需要传递给一个接受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)

我在这里制作了多少份该字符串?

如何将它减少到只有一个副本的字符串流?

fva*_*nee 8

您可以使用此链接中描述的内容:如何直接从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)