美文网首页
Effective STL 第17条

Effective STL 第17条

作者: 懒生活 | 来源:发表于2022-08-29 23:35 被阅读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方式实现好理解多了.

相关文章

  • EFFECTIVE+STL中文版:50条有效使用STL的经验

    《Effective STL中文版:50条有效使用STL的经验》是EffectiveC++的第3卷,被评为“值得所...

  • 常用的 STL 查找算法

    常用的 STL 查找算法 《effective STL》中有句忠告,尽量用算法替代手写循环;查找少不了循环遍历,在...

  • Effective STL 第7条

    容器中的对象如果是指针,指针指向的资源,容器没有办法自动释放. 问题引出 容器在自己析构的时候,会把包含的对象逐个...

  • Effective STL 第28条

    正确使用reverse_iterator对于任何一个容器, 使用iterator, 你只可能正向正序访问容器内部的...

  • Effective STL 第22条

    主要不要修改set mutipleSet的key

  • Effective STL 第30条

    如果是区间操作,注意确保容器具有足够的区间 这个很矛盾, 我们害怕使用数组,就是因为数组有可能越界.为了不去考虑数...

  • Effective STL 第31条

    准确的选择排序算法 如果要对一个数列进行完全的排序,那么用sort是个不错的选择.但是如果只是部分排序, 要考虑更...

  • Effective STL 第34条

    为什么有些算法需要排序的区间 binary_search算法是二分查找, 这种查找需要查找空间的序列是有序的. 为...

  • Effective STL 第19条

    理解相等于等价相等的基础是 == , 如果x==y成立,就说明x和y的值相等对于有顺序关系的容器, 为了顺序的存在...

  • Effective STL 第25条

    散列表: 用key可以作为索引快速找到对应的value. 且这些对象在容器里面不排序. 散列表和标准关联容器set...

网友评论

      本文标题:Effective STL 第17条

      本文链接:https://www.haomeiwen.com/subject/criknrtx.html