容器的size和capacity
容器的size指的是包含有效元素的个数, 容器的capacity,表示容器暂用的内存空间, capacity > size
string s = "hello world";
int a = s.size(); // size = 10
a = s.capacity(); // capacity = 15
s = "1";
a = s.size(); //size = 1;
a = s.capacity(); //capacity 依然是15
在有些情况下,s不在存储长串字符了,这时候可能因为资源的需要,希望s的capacity变小些,占用少一些内存.
resize 和 reserve
resize 是针对size的改动, reserve是对capacity的改动.但遗憾的是他们只能扩大capacity,没有能力缩小capacity.
缩小capacity的方法
最容易想到的方法,自然是,把s中需要的元素拷贝出来,然后把s整个释放. 问题是常规方法,如果没有离开作用域,没有办法释放下例中的s1.
string s1 = "hello world,hello world,hello world,hello world";
s1 = "1";
int a1 = s1.capacity(); //a1 = 47
string s2 = s1;
a1 = s2.capacity(); // a1 = 15
//这里有什么语句可以直接释放s1
能做到即时释放的就是临时变量了. 如果我们通过拷贝构造一个临时变量 如 string(s1), 此时这个临时变量的capacity会比s1的小很多,"刚刚好"容纳有效元素"1". 在这个临时变量析构之前,让他和s1交换. 即语句 string(s1).swap(s1); 这样子就可以实现我们的目的,让s1的容量变小, 但需要注意的是此时的s1已经不是原来的s1了.
string s1 = "hello world,hello world,hello world,hello world";
s1 = "1";
int a1 = s1.capacity(); // a1 = 47
string(s1).swap(s1);
a1 = s1.capacity(); // a1 = 15
c++ 11 之后提供了新的接口,用来实现容量变小的目的
string s1 = "hello world,hello world,hello world,hello world";
s1 = "1";
int a1 = s1.capacity(); // a1 = 47
s1.shrink_to_fit();
a1 = s1.capacity(); // a1 = 15
shrink_to_fit() 接口在vector, string上都有,比swap方式实现好理解多了.
网友评论