对于字符串和向量的shrink_to_fit的实现是不同的?

时间:2018-05-06 23:42:22

标签: c++

我为向量调用了shrink_to_fit(),它减少了向量中元素数量的容量,但是当我使用shrink_to_fit()作为字符串时,它减小了大小但不是字符串中元素的数量。

#include <iostream>
#include<vector>
#include<cstring>
using namespace std;
int main()
{
   vector<char> v1;
   v1.reserve(20);
   v1.push_back('a');
   v1.push_back('b');
   cout << " vector capacity= "<<v1.capacity() <<endl;
   v1.shrink_to_fit();
   cout << " changed vector capacity= "<<v1.capacity() <<endl;

   string s1;
   s1.reserve(20);
   s1.push_back('a');
   s1.push_back('b');
   cout <<" string capacity = " << s1.capacity() <<endl;
   s1.shrink_to_fit();
   cout <<" changed string capacity = " << s1.capacity() <<endl;

}

输出:

  vector capacity= 20
  changed vector capacity= 2
  string capacity = 30
  changed string capacity = 15

1 个答案:

答案 0 :(得分:8)

std::string的现代实现通常提供“短字符串优化”,这意味着在一定长度下的字符串不需要单独分配,而是存储在std::string对象本身内(通常在用于某些指针的空间)。所以,这意味着你不能获得比 - 在你的情况下更少的容量 - 15(它正确,因为那是16与NUL终结器,并且是两个64位指针),因为它直接存储在字符串对象中,当没有更长的时间来解除分配。

此外,您正在将苹果与橙子进行比较; 没有阻止std::vector为较小类型 ¹实现类似的优化,但是你正在比较std::vector<int>(其元素通常是4个字节,所以只有4个符合上述16个字节),std::string(其元素为1字节char)。更恰当的比较是针对std::vector<char>

  1. 实际上,正如评论中所指出的那样,当前的标准要求与这种优化不相容的要求;仍然,主要观点是:在比较两个容器时,您应该这样做以确保“边界条件”相同,这样您就可以发现实际的实现差异(std::string执行SSO,std::vector<char>不会因为你将它们与不同问题进行比较而产生的差异而分散注意力。