istrstream 的更好替代品?
A better replacement for istrstream?
istrstream
非常适合我的需求 - 基本上,采用固定的字符缓冲区,并给我一个简单的方法来提取行 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);
那么 - 想法?
注意:Peter Sommerlad 在这里为 C++ 标准主体提出了这个确切想法的提案:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0448r1.pdf
暂时继续使用istrstream
。在标准采用 P0448 (using std::span<char>
as the source/destination of a stream buffer) or P0408(移动数据 into/outof stringstream
s 的能力)之前,它可能不会被删除。这些都可以很好地满足您的需求。
也就是说,如果您要做的只是在 \n
之间获取子字符串,那么仅使用正则表达式搜索会更有效(即使采用上述建议)。或者只是 常规 搜索,因为您只是在寻找 \n
。这会给你一对代表一条线的迭代器。使用 iostreams 对已加载的字符缓冲区进行逐行处理是多余的,并且永远不会像替代方法那样有效。
istrstream
非常适合我的需求 - 基本上,采用固定的字符缓冲区,并给我一个简单的方法来提取行 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);
那么 - 想法?
注意:Peter Sommerlad 在这里为 C++ 标准主体提出了这个确切想法的提案: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0448r1.pdf
暂时继续使用istrstream
。在标准采用 P0448 (using std::span<char>
as the source/destination of a stream buffer) or P0408(移动数据 into/outof stringstream
s 的能力)之前,它可能不会被删除。这些都可以很好地满足您的需求。
也就是说,如果您要做的只是在 \n
之间获取子字符串,那么仅使用正则表达式搜索会更有效(即使采用上述建议)。或者只是 常规 搜索,因为您只是在寻找 \n
。这会给你一对代表一条线的迭代器。使用 iostreams 对已加载的字符缓冲区进行逐行处理是多余的,并且永远不会像替代方法那样有效。