21

这个问题与这个问题有关,但并不完全相同。

除了与可读性相关的问题之外,使用std::vector<char>而不是std::string保存任意二进制数据有什么好处吗?

即与字符串相比,使用向量执行哪些任务更容易/更有效/更好?

4

6 回答 6

21

除了可读性(不应被低估)之外,我还可以想到使用std::stringover的几个小性能/内存问题std::vector

  • 一些现代std::string实现使用小字符串优化。如果存储的数据大于string的内部缓冲区,就变成了悲观化,降低了复制、移动和swap1的效率,无益地增加了sizeof()

  • 一个有效的std::string实现将始终分配比当前大小至少多 1 个字节来存储终止空值(不这样做需要额外的逻辑operator[]来处理str[size()])。

我应该强调,这两个问题都非常小。它们的性能成本很可能会在背景噪音中丢失。但你确实问了。


1如果正在使用小字符串优化,则这些操作需要分支,而在良好的实现size()中它们没有。std::vector

于 2012-07-06T09:10:04.340 回答
1

是的vector<char>确实比.string

与, 不同stringvector<char> 保证在操作期间保留迭代器、引用等swap。请参阅:可以std::vector利用小缓冲区优化吗?

于 2012-09-26T19:53:19.430 回答
1

除了可读性,并确保另一个维护者不会混淆std::string. 如果效率是唯一的考虑因素,您当然也可以考虑 char*/malloc。

我能想到的一个潜在问题:

std::string默认为存储<char>。如果您以后需要处理另一种类型(例如 unsigned short),您可能需要:

  • 创建您自己的 typedef std::basic_string<unsigned short>(这使您远离正常std::string处理)
  • 尝试在 setter 中应用一些 reinterpret_cast 逻辑。

使用矢量,您可以简单地将容器更改为std::vector<unsigned short>.

于 2012-07-06T09:19:24.953 回答
0

I think the only benefit you would gain from doing that would the ease of incrementing over the std::vector of characters, but even that can be done with an std::string.

You have to remember that even though std::string seems like an object, it can be accessed like an array, so even accessing specific parts of a string can be done without the use of a std::vector

于 2012-07-06T08:50:55.983 回答
0

理想情况下,人们会使用它vector<unsigned char>来存储任意二进制数据——但我认为你已经知道这一点——正如你提到的旧问题。

除此之外,使用向量肯定会更节省内存,因为字符串会添加一个终止 Nul 字符。由于两者的分配机制不同,性能也可能会提高 - 向量保证连续内存!

除此之外,使用字符串是不正确的,因为调用者/用户可能会无意中调用一些字符串方法,这可能是一场灾难。

于 2012-07-06T09:26:13.133 回答
0

正如其他答案所提到的,向量可能会稍微快一些,因为它保证了连续的内存,即使对于小尺寸也是如此,并且不会在最后添加额外的空字节。但是,连接两个字符串比连接两个向量要简单得多(在代码方面):

使用vector

vector<char> a, b;
// ...
vector<char> c;
c.insert(c.end(), a.begin(), a.end());
c.insert(c.end(), b.begin(), b.end());

使用string

string a, b;
// ...
string c = a + b;
于 2019-04-10T08:22:48.473 回答