更好地替代istrstream?

时间:2018-01-31 21:05:27

标签: c++ stringstream c++17 string-view

istrstream非常适合我的需求 - 基本上,采用固定的char缓冲区,并提供一种简单的方法来提取行getline()并测试eof()

我正在将我们的项目转换为C ++ 17合规性 - 已弃用istrsteam - 显然是因为有太多的C ++程序员无法理解固定的缓冲内存管理(你认真吗?!)

无论如何,istringstream提供相同的使用语义,但它现在需要在构造时复制整个固定字符缓冲区。

这是一种反模式。

我正在寻找的方法是使用string_view代替string istringstream,或者更好地替换stringstream本身strstream处理外部管理的固定缓冲区(它只需指向它,它永远不必担心管理该资源,就像 std::string_view raw_view(reinterpret_cast<const char *>(raw_buffer.get()), raw_buffer.size()); std::istringstream raw_stream(raw_view); 那样)。

目前,在VS 2017中,这是非法的,如果我理解正确的话,在目前最先进的C ++中是非法的(如果我错了,我相信你会纠正我!)

app.listen()

所以 - 想法?

注意:Peter Sommerlad在此为C ++标准组织提出了这个确切想法: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0448r1.pdf

1 个答案:

答案 0 :(得分:6)

暂时继续使用istrstream。在P0448(使用std::span<char>作为流缓冲区的源/目标)或P0408(将数据移入/移出{{1}的能力)之前,可能不会删除它} s)被标准采用。这些都可以很好地满足您的需求。

话虽如此,如果您要做的只是在stringstream之间获得子串,那么使用正则表达式搜索会更有效(即使使用上述提议)。或者只是常规搜索,因为您只是在寻找\n。那会给你一对代表一条线的迭代器。使用iostream对已经加载的字符缓冲区进行逐行处理是过度的,并且永远不会像替代方案那样高效。