C++:关于string

C++:关于string

刷LeetCode的时候明明自己写的算法思路和题解一样,但是运行却速度慢了几倍,内存消耗谜之巨大,找了半天原来是数据结构和赋值运算的问题。这次踩坑了赶紧记下来,防止以后再出现类似的问题。

用string处理char类型数据

string是C++中最适合处理处理字符型数据的容器,直接用就行,不要试图使用vector<char>之类的东西,否则速度和内存占用性能都会下降。

用+=拼接string

在C++Primer在复合赋值运算符一节中有这样一段话:“任意一种复合运算符都完全等价于普通运算符加赋值运算,唯一的区别是左侧运算对象的求值次数:使用复合运算符只求值一次,使用普通的运算符则求值两次。这两次包括:一次是作为右边子表达式的一部分求值,另一次是作为赋值运算的左侧运算对象求值。其实在很多地方,这种区别除了对程序性能有些许影响外几乎可以忽略不计。”

但是对于string来说,这种影响往往不能忽略不计,当需要拼接字符串是,要使用+=而不要分开使用+和=。如书中所说,一个string对象可能占用空间比较大,对其进行处理时要尽可能避免拷贝行为。当我们使用+=时,我们直接将+=右侧的string拼接到左侧的string之后,一步完成,没有额外开支;而当我们分别使用+和=时,首先需要计算=右侧带有+的表达式,这个表达式的结果是一个临时量string,之后再通过赋值运算将这个临时量拷贝给左侧的string对象。一来二去,内存消耗也大了,速度也降了,得不偿失。

另外,使用string类的成员函数append连接两个string的效果和+=是完全一样的。因为string类对于+=运算符的重载实际上就是调用了其append成员函数:

    basic_string& operator+=(const basic_string& _Right) { // append _Right
        return append(_Right);
    }

append有不少重载版本,有时间可以研究一下。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值