c++字符串逆序——头插方式构建和调用reverse()对比

本文探讨了C++中字符串操作的效率差异,通过对比+'a'和+=操作,以及使用reverse()逆序,分析了两者在内存消耗和执行速度上的不同。实验结果显示,+=操作和reverse()在效率上优于头插+'a',尤其是在大规模数据下。
摘要由CSDN通过智能技术生成

菜鸡出没,大佬莫喷

起因

在做一道题时产生疑问,有构建字符串的过程如下(是抽象后的,不是原题):

string s;
// 类似头插
for(int i = 0; i < 10; i++){
	s = i + s;
}

然后在<algorithm>头文件是提供了逆序的函数

string s;
//类似尾插
for(int i = 0; i < 10; i++){
	s += i;
}
reverse(s.begin(), s.end());

那么问题来了,哪个更快呢?有什么本质上的差异呢?

分析

  1. 先说说string+运算符
    注意:这里说的是string类,所以单纯的字符串面量和字符的+是没有连接作用的,所以如果想要使用+连接,就必须保证操作符的左右操作数至少有一个是string对象
  2. +=+的一个区别
    + 会重新创建一个对象,然后再返回这个新的对象;+=是直接在原对象后面添加
    从源码上可以看出
    在这里插入图片描述在这里插入图片描述
    再直观一些,我们执行如下代码
    #include <iostream>
    #include <string>
    #include <windows.h>
    
    #define LEN 100000
    using namespace std;
    
    int main(int argc, char const *argv[])
    {
        DWORD start, end;
        start = GetTickCount();
        cout << "start:" << start << endl;
        string s1;
        for (int i = 0; i < LEN; i++)
        {
            s1 = 'a' + s1;
        }
        end = GetTickCount();
        cout << "end:" << end << endl;
        cout << end - start << endl;
    
        start = GetTickCount();
        cout << "start:" << start << endl;
        string s2;
        for (int i = 0; i < LEN; i++)
        {
            s2 += 'b';
        }
        end = GetTickCount();
        cout << "end:" << end << endl;
        cout << end - start << endl;
    
        return 0;
    }
    
    
    运行结果如下:
    在这里插入图片描述
    由此,我们可以得出++=更耗时,更占用空间
  3. reverse()原理
    可以看源码如下
    在这里插入图片描述
    可以看到是使用双指针的方式,交换两端的指针的所指的值,时间复杂度为O(n),就很快啊
    然后我们修改以下字符串的构造方式
    s1 = char('a' + (i % 26)) + s1;
    
    再次运行计时的代码,有如下结果
    在这里插入图片描述
    显然后者全面占优了

总结

  • 使用+操作符进行类似头插的操作,会因为创建新的对象开销极大
  • 使用+=操作符和reverse()函数实现逆序不会创建新的对象,开销较前者小得多
  • 建议使用+=

如有错误,望指正

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值