c ++字符串中“size”和“capacity”的区别?

时间:2013-09-25 04:37:37

标签: c++ string stl

我在Thinking in C ++中有这个片段。

#include <iostream>
#include <string>

int main ()
{
string bigNews("I saw Elvis in a UFO. ");
cout << bigNews << endl;
 bigNews.insert(0, " thought I ");
cout << bigNews << endl;
cout << "Size = " << bigNews.size() << endl;
cout << "Capacity = "
<< bigNews.capacity() << endl;
bigNews.append("I've been working too hard.");
cout << bigNews << endl;
cout << "Size = " << bigNews.size() << endl;
cout << "Capacity = "
<< bigNews.capacity() << endl;
  return 0;
}

我得到的输出如下所示:

I saw Elvis in a UFO. 
 thought I I saw Elvis in a UFO. 
Size = 33
Capacity = 44
 thought I I saw Elvis in a UFO. I've been working too hard.
Size = 60
Capacity = 88

我可以弄清楚为什么尺寸会增加,但我无法弄清楚容量如何增加?

我所知道的是容量是字符串缓冲区,我们可以在其中推回,但是如何分配空间?

2 个答案:

答案 0 :(得分:8)

capacity是字符串当前可以保持而不必增长的最大字符数。 size是字符串中实际存在的字符数。它们是独立概念的原因是分配内存通常是低效的,因此您尝试通过获取比实际需要的内存更多的内存来尽可能少地分配。 (许多数据结构使用“加倍”方法,如果它们达到N的容量并需要更多空间,它们将分配2*N空间,以避免不久之后再次重新分配。)< / p> 当您使用字符串并需要更多空间时,

capacity会自动增加。您也可以使用reserve功能手动增加它。

答案 1 :(得分:3)

来自documentation

  

capacity()

     

返回当前分配的存储中可以保留的字符数   (公共成员职能)

因此,它是内部缓冲区的分配大小。你看到的是当它耗尽时它的大小加倍 - 这是一种有效使用动态大小缓冲区的常用技术,它被称为“指数存储扩展”。它归结为基本上是这样的:

void resize_buffer(char **buf, size_t *cap, size_t newsize)
{
    while (newsize > *cap)
        *cap *= 2;

    *buf = realloc(*buf, *cap);
}

(当然,这在很大程度上已经简化了,不要将它用于生产中的实际重新分配代码。)可能你的std::string实现正在使用这个技巧,这就是你看到缓冲区大小增加100的原因%。