istrstream 非常适合我的需求 - 基本上,采用固定的字符缓冲区,并给我一个简单的方法来提取行 getline() 并测试 eof()
我正在将我们的项目切换到 C++ 17 合规性 - 它已弃用 istrsteam - 显然是因为有太多的 C++ 程序员无法理解固定缓冲区内存管理(你是认真的吗?!)

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

这是一种反模式。

我正在寻找的是一种使用 string_view 代替 stringistringstream 的方法,或者是 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);

所以 - 想法?

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

最佳答案

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

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

关于c++ - istrstream 的更好替代品?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48551406/

10-12 18:08