专栏首页sringbootC++ string库 resize坑

C++ string库 resize坑

#include <sys/time.h>

int main()
{
  string str1;
  string str2;
  str1.resize(100000000);
  unsigned long realtime;
  struct timeval ts;
  unsigned long timecount;
  gettimeofday(&ts, NULL);

  timecount = ts.tv_sec * 1000 + ts.tv_usec / 1000;

  cout << "init time:" << timecount << endl;
  for (size_t i = 0; i < 100000000; i++)
  {
    str1.append("1");
  }
  gettimeofday(&ts, NULL);
  realtime = ts.tv_sec * 1000 + ts.tv_usec / 1000;

  cout << "time2:" << realtime - timecount << endl;
  timecount = realtime;

  for (size_t i = 0; i < 100000000; i++)
  {
    str2.append("1");
  }
  gettimeofday(&ts, NULL);
  realtime = ts.tv_sec * 1000 + ts.tv_usec / 1000;
  cout << "time3:" << realtime - timecount << endl;

  // resize() 垃圾方法  没啥用
}
  • 输出值 init time:1576488420443 time2:787 time3:792

结论: 看出来了没有不论是否resize()字符串数组大小,然后append速度都是一样的。 所以认为resize()后性能会很好,会很棒棒的人,就别这样做了, 不仅不会优化性能还会降低以及后面一连串错误,比如c_str(),data()不能达到预期。

原因 具体我也不了解,这个和vector容器,以及string的机制有关。 并且如果string当前的size()小于resize()值 之后,c_str()返回的会是一个空值, data()方法也不能返回预期的值。 原因是resize()后会重新分配一份内存, c_str()返回的依然是旧内存的地址(可能), 有人误人子弟说这时该data()方法来获取,我试了也不行。

在string上resize方法的解释:

 Resizes the %string to the specified number of characters.
       *  @param  __n  Number of characters the %string should contain.
       *
       *  This function will resize the %string to the specified length.  If
       *  the new size is smaller than the %string's current size the %string
       *  is truncated, otherwise the %string is extended and new characters
       *  are default-constructed.  For basic types such as char, this means
       *  setting them to 0.

具体就是说resize,如果当前resize值大于当前字符串size()值,就会增加字符串的长度,然后调用append是在新增长度末尾增加的,实际测得确实如此. 如果小于当前值,就是截断当前字符串.

最后强烈建议还是别用resize() 缺点太多未知隐患太多,不是很懂能不用就不用.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python 计算简单移动平均

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    多凡
  • Spring AOP 相关概念(学前必知)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    多凡
  • Spring 常用注解

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    多凡
  • P2880 [USACO07JAN]平衡的阵容Balanced Lineup

    题目背景 题目描述: 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛....

    attack
  • Codeforces 833D Red-black Cobweb【树分治】

    D. Red-black Cobweb time limit per test:6 seconds memory limit per test:256 mega...

    Angel_Kitty
  • HDU 3480 Division

    Problem Description Little D is really interested in the theorem of sets recen...

    attack
  • POJ--1699 Best Sequence(DP+dfs)

    Best Sequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions...

    ShenduCC
  • scrapy - Request 中的回调函数不执行or只执行一次

    调试的时候,发现回调函数 parse 没有被调用,这可能就是被过滤掉了,查看 scrapy 的输出日志 offsite/filtered 会显示过滤的数目。这个...

    周小董
  • leetcode436. Find Right Interval

    假设一个二维的整数数组中每一行表示一个区间,每一行的第一个值表示区间的左边界,第二个值表示区间的右边界。现在要求返回一个整数数组,用来记录每一个边界右侧最邻近的...

    眯眯眼的猫头鹰
  • 洛谷P3531 [POI2012]LIT-Letters

    题目描述 Little Johnny has a very long surname. Yet he is not the only such person i...

    attack

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动