gpt4 book ai didi

c++ - 基于 std::vector 创建 std::stringbuf

转载 作者:搜寻专家 更新时间:2023-10-31 01:15:39 25 4
gpt4 key购买 nike

我正在两个框架(OpenSceneGraph 和 wxWidgets)之间进行内存中图像转换。不想关心底层类(osg::ImagewxImage),我使用两个 API 都提供的面向流的 I/O 功能,如下所示:

1) 创建一个std::stringstream

2) 使用 OSG 的编写器写入流

3) 使用 wxWigdets 阅读器从流中读取

这很有效。到目前为止,我一直在使用对流缓冲区的直接访问,但最近我的注意力被 std::stringstream 的“非连续底层缓冲区”问题所吸引。我一直在使用 kludge 获取缓冲区的 const char* ptr - 但它有效(在 Windows、Linux 和 OSX 上测试,使用 MSVC 9 和 GCC 4.x),所以我从未修复

现在我明白这段代码是一颗定时炸弹,我想摆脱它。这个问题已经在 SO ( here for instance ) 上多次提出,但我找不到真正可以帮助我做可能可行的最简单事情的答案。

我认为最合理的做法是在幕后使用 vector 创建我自己的 streambuf - 这将保证缓冲区是连续的。我知道这不是一个通用的解决方案,但考虑到我的限制:

1) 所需的大小不是无限的,实际上是可以预测的

2) 由于 API,我的流确实需要是 std::iostream(我不能使用原始字符数组)

有人知道我如何使用字符 vector 来自定义 stringbuf 吗?请不要回答“使用 std::stringstream::str()”,因为我知道我们可以,但我正在寻找其他东西(即使你会说复制 2-3 MB 是如此之快,以至于我什至不会注意到其中的区别,让我们考虑一下我仍然对自定义 stringbufs 感兴趣只是为了练习的美感)。

最佳答案

如果你可以只使用 istreamostream (而不是双向),不需要求,很简单(大约10行代码)来创建你自己的 streambuf使用 std::vector<char> .但除非字符串非常非常大,否则何必呢? C++11标准保证 std::string是连续的;那一个char*通过 &myString[0] 获得可以用作 C 样式数组。` 而C++11 添加此保证的原因是承认现有的实践;根本没有任何实现,这不是案例(现在它是必需的,不会有任何实现 future 情况并非如此)。

关于c++ - 基于 std::vector<char> 创建 std::stringbuf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9869018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com