在C ++标准库中,std::string
有一个公共成员函数capacity()
,它返回内部分配存储的大小,一个大于或等于字符串中字符数的值(根据到here)。这个值可以用于什么?它与自定义分配器有关吗?
答案 0 :(得分:10)
您更有可能使用reserve()
成员函数,将容量设置为至少提供的值。
capacity()
成员函数本身可能用于避免分配内存。例如,您可以通过池回收使用过的字符串,并根据其容量将每个字符串放在不同大小的存储桶中。然后,池的客户端可以请求已经具有一些最小容量的字符串。
答案 1 :(得分:6)
string::capacity()
函数返回std::string
在重新分配内存之前可能包含的总字符数,这是一项非常昂贵的操作。
std::vector
的工作方式相同,因此我建议您查找std::vector
here,详细说明已分配和已初始化内存之间的差异。
<强> 更新 强>
嗯,我可以看到我误解了这个问题,实际上我认为我从未在std :: string或std :: vector上使用过capacity(),似乎很少有任何理由,因为你必须要调用reserve
答案 2 :(得分:3)
它为您提供字符串可以包含的字符数,而无需重新分配。我认为这在分配费用昂贵的情况下可能很重要,并且你想避免它,但我必须说这是一个我从未在实际代码中使用过的字符串成员函数。
答案 3 :(得分:2)
如果您要在字符串中添加大量字符,它可用于某些性能调整。在开始字符串操作之前,您可以检查容量,如果它太小,reserve只需一步完成所需的长度(而不是让它连续多次重新分配更大的内存块,这将是一个性能猪)。
答案 4 :(得分:2)
字符串具有容量和大小。容量表示字符串在分配更多内存之前可以容纳的字符数。大小表示当前持有的字符数。 reserve()
可用于设置字符串的最小容量(它将为分配内存,至少该字符数,但可以分配更多)。
如果您增加字符串的大小,这一点非常重要。当您使用+=
或append()
连接到字符串时,给定字符串中的字符将添加到当前字符串的末尾。如果将字符串增加到该大小不超过容量,那么它将使用它具有的容量。但是,如果新大小超过当前容量,则字符串必须在内部重新分配内存并将其内部复制到新内存中。如果你要做那么多,它可能会变得昂贵(虽然它是在摊销的常量时间内完成的),所以在这种情况下,你可以使用reserve()
预分配足够的内存来减少重新分配的频率必须发生。
矢量函数的功能基本相同,具有相同的功能。
就个人而言,虽然我不时地用向量处理capacity()
和reserve()
,但我从未见过用字符串做太多的事情 - 可能是因为我一般不做我的代码中有足够的字符串连接值得它。在大多数情况下,特定的字符串可能会有一些串联但不足以担心其容量。在尝试优化代码时,通常会担心容量问题。
答案 5 :(得分:1)
几乎没有任何相关用途。它类似于std :: vector :: capacity。但是,字符串最常见的用途之一是赋值。分配给std :: string时,其.capacity可能会更改。这意味着实现有权忽略旧容量并准确分配足够的内存。
答案 6 :(得分:1)
它真的不是很有用,可能只有vector
的对称性(假设两者都以相同的方式在内部运作)。
保证向量的容量会影响调整大小的行为。将向量调整为小于或等于容量的值不会导致重新分配,因此不会使引用向量中元素的迭代器或指针无效。这意味着您可以通过在向量上调用reserve来预先分配一些存储,然后(小心)通过调整大小或推回(等)来向其添加元素,安全地知道底层缓冲区不会移动。
但string
没有这样的保证。似乎容量仅用于提供信息 - 尽管这是一个延伸,因为它看起来似乎没有任何有用的信息可以从中获取。 (更糟糕的是,字符串字符的连续性也不能保证,因此你可以将字符串作为线性缓冲区的唯一方法是c_str()
- 这可能会导致重新分配。)
据猜测,string
大概原本打算作为vector
的某种特殊情况实施,但随着时间的推移,两者分开......