我为向量调用了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
答案 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>
。
std::string
执行SSO,std::vector<char>
不会因为你将它们与不同问题进行比较而产生的差异而分散注意力。