zoukankan      html  css  js  c++  java
  • string的reserve和resize

    一、size和capicity

    size是实际长度,capicity是预留空间,请看下面的例子。

    (1)str 是个空字符串,它的 size 为0,但它的 capicity 为15

     

     (2)继续往下调试走:

    str 被赋予了字符串 "123456" ,它的 size 变成了6 ,capicity还是15

      (3)继续往下调试走:

    str 被赋予了字符串 "123456123456" ,它的 size 变成了12 ,capicity还是15

     (4)继续往下调试走:

    str 被赋予了字符串 "123456123456123456" ,它的 size 变成了18 ,capicity变成了 31

     

    (5)继续往下调试走:

    str 被赋予了字符串 "1" ,它的 size 变成了1,capicity还是 31

    二、reserve

    可以使用 reserve 函数来指定 capicity 的大小:

    int N = 10;
    string  str;
    str.reserve(N);

    但需要注意的是 str 的capicity 的大小并不一定是 n,

    按照:(i*16-1)的规律,i>=1,取 capicity = (i*16-1)>=N,并使得 capicity 离 N最近。例如上例,capicity = 15。

    三、resize

    可以使用 resize函数来指定 size 的大小,也就是字符串的实际大小。

    在此过程中可能会发生字符串的截断或者扩展:

    1.扩展

    可以看到,str 的size 和 capicity都发生了变化,在原有的字符串后面用  补齐。

    2.截断

      str 被截断成两个字符,capicity 没有发生变化。

    四、小结

    string的size是实际长度,capicity是预留长度,

    当字符串被赋予的值的长度大于capicity的时候,字符串会先自动扩容,使用(i*16-1)规则来扩容,

    保证capicity大于等于被赋予的值的长度,最后完成赋值。

    所以如果事先知道被赋值得字符串的大小,可以先用reserve来设置capicity的大小,有时候可提高程序性能:

    string remove_crtl(string s)
    {
        string result;
        result.reserve(s.length()); //用reserve一次扩容到位,避免多次扩容
        for(int i=0;i<s.length();++i)
        {
            if(s[i]>=0x20)
                result +=s[i];
        }
        return result;
    }
  • 相关阅读:
    如何在存储过程中临时设置数据库兼容级别
    PHP中如何防止SQL注入
    Android 源码下载
    HDU 2517 棋盘分割
    OceanBase里面的rowkey是什么概念,是由哪些要素构成的?
    JavaScript的递归之更多例子
    C++库研究笔记——生成一组随机数
    Neutron 如何支持多种 network provider
    理解 Neutron Server 分层模型
    Neutron 物理部署方案
  • 原文地址:https://www.cnblogs.com/hosseini/p/15098942.html
Copyright © 2011-2022 走看看