更好地替代istrstream?

Mor*_*hai 4 c++ stringstream string-view c++17

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

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

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

这是一种反模式.

我正在寻找的是一种方法来string_view代替一个string用于istringstream替代,或者替代一个更好的替代,stringstream它本身处理外部管理的固定缓冲区(它只需指向它,它永远不需要担心管理该资源,只是一样strstream).

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

    std::string_view raw_view(reinterpret_cast<const char *>(raw_buffer.get()), raw_buffer.size());
    std::istringstream raw_stream(raw_view);
Run Code Online (Sandbox Code Playgroud)

那么 - 想法?

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

Nic*_*las 6

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

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