C++字符串和vector<char>的区别

6
每个人都知道,对于所有字符串应用程序,我们应该首选C ++中的string类,因为它们执行许多特殊功能并具有动态增长和缩小的能力。对于其他数据类型和类,vector表现出色,就像string对于字符一样。
但是,在什么情况下我们需要优先选择vector(我很少看到),而不是string呢?

2
处理二进制数据时, - Alex Díaz
6
不用谢! - DevInd
1
@CppNITR 如果您正在阅读二进制文件,则希望将其存储在 std::vector<char> 中,考虑任何不是文本的文件(例如可执行文件) - Alex Díaz
1
我个人想要看到 byte 而不是 char,并让定义在幕后处理有符号或无符号。 - Michael Dorgan
5
vector是一个容器,string则是一个字符串。 - Kerrek SB
显示剩余9条评论
2个回答

7

如果我明确要存储字符数组,而不是字符串,我会使用vector<char>。例如,如果由于某种原因我需要收集特定文本中使用的所有字符,则结果可能是一个vector<char>

明确表达意图非常重要。


1
好的评论。属于答案。我建议编辑答案以突出这一点。 - user4581301
你也可以使用字符串来做相同的事情,因为字符串也有 push_back、pop_back 等类型函数,这些函数向量也在使用。 - DevInd
1
@cdonat,我想CppNITR提出的疑问是合理的,请至少提供更好的理由。 - Anwesha
1
@CppNITR 是的,但这是一个可读性问题,也是其他问题之一。你的代码读者看到 string,他们会期望某些事情是真实的,其中最重要的是字符串变量包含可读且可能可打印的文本。而 vector 包含的内容则因模板参数和内容解释的范围而异。 - user4581301
在我的例子中,我将独立的字符值存储在向量中,而不仅仅是字节。由于我说过,这是关于表达意图的,因此我们在这里有一个有序的、与其他字符无关的集合。它不是任何类似文本的东西,因此没有std::string,实际上它是字符,而不仅仅是字节,因此也没有std::vector<unsigned char>或类似的东西。 - cdonat
显示剩余3条评论

1
简而言之:如果您要存储文本,则使用 string,否则使用 vector<char>

1
你介意用一个好的例子详细说明吗? - DevInd
1
在这种情况下,我更喜欢使用 using byte = char;vector<byte>,以清楚地表示它存储的是原始二进制数据而不是字符。请参见此答案,了解为什么要使用 char 而不是 unsigned char - emlai
@zenith:你的意思是如果我使用unsigned char会有问题吗? - user5387678
@quser 是的,当使用C++标准库进行二进制I/O时,您需要进行类型转换。 - emlai
@zenith:为什么C++ I/O需要char指针作为参数?老实说,我并没有真正理解你提供的答案。 - user5387678
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接