用于保存原始数据的std :: string或std :: vector <char>

011*_*110 6 c++ string

我希望这个问题适用于stackoverflow ...将原始数据字节(8位)std::string存储在一个而不是存储在其中的区别是什么std::vector<char>.我正在读取文件中的二进制数据并将这些原始字节存储在a中std::string.这很有效,这样做没有任何问题或问题.我的程序按预期工作.但是,其他程序员更喜欢这种std::vector<char>方法并建议我停止使用,std::string因为它对原始字节不安全.所以我想知道为什么std::string用来保存原始数据字节会不安全?我知道std::string最常用于存储ASCII文本,但是一个字节是一个字节,所以我不明白它的偏好std::vector<char>.

谢谢你的建议!

J.N*_*.N. 13

问题不在于它是否有效或不成功.问题是,对于下一个阅读代码的人来说,这完全令人困惑.std::string用于显示文本.任何人都在阅读你的代码.你会用a表示你的意图更好std::vector<char>.

它会增加您在代码审查中的WTF/min.

  • 从更多的角度来看,当我想到"字节"时,我认为`uint8_t`.在大多数情况下,当我使用缓冲区时(例如使用`new char []`来分配我要构建对象),或者使用一些使用`char`的既定API.我通常希望有一个`std :: vector <uint8_t>`来存储原始字节数据. (3认同)
  • 我从来没有这样想过。好点子。我认为 std::string 是一个保存字节的容器。它们可以是 ASCII 字节,但不要求如此。在我看来, std::string 就是 std::bytes,但很高兴知道其他人有不同的想法。我知道这会多么令人困惑。 (2认同)

Nic*_*las 5

在C++ 03中,std::string用于存储字节数据数组并不是一个好主意.按标准,std::string并没有必须存储数据连续.C++ 11修复了它,因此它的数据必须是连续的.

所以在C++ 03中这样做是行不通的.除非您亲自审查您的C++标准库实现,std::string以确保它是连续的.

无论哪种方式,我都会建议vector<char>.通常,当你看到string,你希望它是一个...字符串.你知道,某种形式的编码中的一系列字符.A vector<char>很明显它不是一个字符串,而是一个字节数组.