【问题标题】:std::istringstream from std::string without copying来自 std::string 的 std::istringstream 无需复制
【发布时间】:2013-05-28 08:09:05
【问题描述】:

我一直在用这个:

ifstream in("file.txt")
string line;    
getline(in,line);
istringstream iss(line);
...

进行一些简单的解析。 我想避免不必要的复制以提高性能,所以我尝试了:

ifstream in("huge_line.txt");
string line;
getline(in,line);
istringstream ss;
ss.rdbuf()->pubsetbuf(const_cast<char*>(line.c_str()), line.size());
...

它似乎可以完成这项工作(即显着提高性能)。我的问题是,考虑到 const_cast,这是否安全? 我的意思是,只要我使用 istrinstream,内部缓冲区就永远不会被 istringstream 类写入,因此只要 line 变量有效且未更改,ss 变量就应该保持有效状态,对吧?

【问题讨论】:

  • ss.rdbuf()-&gt;pubsetbuf(&amp;line.front(), line.size()); 短版,也避免了丑陋的演员表
  • 我想知道为什么istringstream 没有构造函数来从字符串中移动

标签: c++ istringstream


【解决方案1】:

ss.rdbuf()-&gt;pubsetbuf 的效果是实现定义的,因此不一定符合您的预期。

因此,您更改的代码的效果不需要与最初的效果相同。

【讨论】:

    【解决方案2】:

    const_cast 是安全的,因为std::string 的底层缓冲区不是const。是的,只要在读取ssline 没有过期,你的程序应该没问题。

    【讨论】:

      猜你喜欢
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 2021-10-30
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      相关资源
      最近更新 更多