C++ 是否存在一种类似于std::string的类型(即,包含任意长度的数据块)不使用空终止符?

C++ 是否存在一种类似于std::string的类型(即,包含任意长度的数据块)不使用空终止符?,c++,c++11,C++,C++11,我使用std::string保存任意二进制数据块。它是这样工作的,但效率稍低,因为它需要在blob的末尾添加null终止符。(C++11规范是C_str()和data()是相同的,并且返回一个指向一个blob的指针,该blob的末尾有一个空终止符。)是否有更好的类型可以使用,它仍然支持常见的操作(复制构造函数、赋值运算符等)?使用std::vector。文档:使用正确的工具进行作业。A被设计用来存储和操作类char对象的序列。这包含了一个定义文本处理的机制(),该机制可用于引入比终止空字符更多的

我使用
std::string
保存任意二进制数据块。它是这样工作的,但效率稍低,因为它需要在blob的末尾添加null终止符。(C++11规范是
C_str()
data()
是相同的,并且返回一个指向一个blob的指针,该blob的末尾有一个空终止符。)是否有更好的类型可以使用,它仍然支持常见的操作(复制构造函数、赋值运算符等)?

使用
std::vector
。文档:

使用正确的工具进行作业。A被设计用来存储和操作类
char
对象的序列。这包含了一个定义文本处理的机制(),该机制可用于引入比终止空字符更多的开销。例如,字符特征可以用于对字符串进行不区分大小写的排序。二进制数据块不是“文本”,因此字符串在语义上并不适合手头的工作

最适合二进制数据的是,但直到C++17才引入,这个问题被标记为C++11。17之前的选项是
char
unsigned char
(和
std::uint8\u t
,如果提供了该类型并且不需要进行类型别名);我建议使用后者,因为签名类型添加了不适用于原始二进制数据的语义

一旦为数据选择了基本单位,就需要将其中的几个单位收集到一个数据库中。当你没有特别的理由选择一个容器而不是另一个容器时,使用a,因为它在很多情况下表现良好。(更不用说
std::string
的功能是
std::vector
加上额外的字符串功能。您想消除额外字符串功能的开销,对吗?)

std::vector//C++17
std::vector//早期标准

空终止符使其效率低下?你怎么会这么想?那么,也许你会喜欢
std::vector
?为什么你认为空终止会有任何代价?(并不是说它有零,但如果它有任何可测量的影响,我会感到惊讶)有
std::vector
,但它没有进行短缓冲区优化。它对您重要吗?
std::vector
因为它是二进制数据,所以您应该使用
std::vector
std::vector<std::byte>      // C++17
std::vector<unsigned char>  // Earlier standards