Effective STL 第17条

2022-08-29  本文已影响0人  懒生活

容器的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方式实现好理解多了.

上一篇 下一篇

猜你喜欢

热点阅读