有没有办法获得 std:string 的缓冲区

新手上路,请多包涵

有没有办法获得“原始”缓冲区 oa std::string?

我正在考虑类似于 CString::GetBuffer() 的东西。例如,使用 CString 我会这样做:

 CString myPath;
::GetCurrentDirectory(MAX_PATH+1, myPath.GetBuffer(MAX_PATH));
myPath.ReleaseBuffer();

那么,std::string 有类似的东西吗?

原文由 MikMik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

如果您想要一个真正的缓冲区,请使用 std::vector<char>

 #include <vector>
#include <string>

int main(){
  std::vector<char> buff(MAX_PATH+1);
  ::GetCurrentDirectory(MAX_PATH+1, &buff[0]);
  std::string path(buff.begin(), buff.end());
}

Ideone 上的示例

原文由 Xeo 发布,翻译遵循 CC BY-SA 3.0 许可协议

虽然有点不正统,但使用 std::string 作为线性内存缓冲区是完全有效的,唯一需要注意的是,直到 C++11 标准才支持它。

 std::string s;
char* s_ptr = &s[0]; // get at the buffer

引用 赫伯萨特 的话,

我所知道的每个 std::string 实现实际上都是连续的并且以空值终止其缓冲区。因此,尽管没有正式保证,但实际上您可以通过调用 &str[0] 来获得指向连续且以空字符结尾的字符串的指针。 (但为了安全起见,您仍应使用 str.c_str() 。)

“可能” 是这里的关键。因此,虽然这不是保证,但您应该能够依赖 std::string 是线性内存缓冲区的原则,并且您应该在测试套件中断言有关这一点的事实,以确保这一点。

您始终可以构建自己的缓冲类,但当您想购买时,这就是 STL 必须提供的。

原文由 John Leidegren 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题