C++使用中常见问题总结(二)

1、快速幂求解

假设要求a^b,按照一般的思路就是把a连乘b次,很显然时间复杂度为O(n),而快速幂能却能达到O(logn),其的原理如下:

  假设要求a^b,其实b是可以用二进制表示的,该二进制数第i位的权为2^(i-1),例如当b=11时,11的二进制为1011,即11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,于是有a^11=a^(2^0+2^1+2^3),即可将a^11转化为算 a^(2^0)*a^(2^1)*a^(2^3) ,总体来说快了很多,原来需算11次,而现在只需算3次。

  对于处理二进制数,一般很会想到用位运算这个强大的工具: &  和 >> ,&运算通常用于二进制取位操作,例如一个数 & 1 的结果就是取该二进制的最末位,同时还可以判断该数的奇偶 x&1==0 为偶,x&1==1为奇。>>运算为移位运算符,将二进制的最后一位去掉。

具体代码如下:

int QuickPow(int a,int b){
    int result = 1, base = a;
  
    while( b != 0 ){
        //当二进制位为1时,将更新后的base累乘到result中
        if( b&1 != 0 )
          result = result * base;
        //只要b不为0,就要更新base
        base = base * base;
        //通过右移遍历所有的二进制位
        b = b >> 1;
  }
    return result;
}

2、简述C++虚函数作用及底层实现原理

       要点是要答出虚函数表和虚函数表指针的作用。C++中虚函数使用虚函数表和 虚函数表指针实现,虚函数表是一个类的虚函数的地址表,用于索引类本身以及父类的虚函数的地 址,假如子类的虚函数重写了父类的虚函数,则对应在虚函数表中会把对应的虚函数替换为子类的 虚函数的地址;虚函数表指针存在于每个对象中(通常出于效率考虑,会放在对象的开始地址处), 它指向对象所在类的虚函数表的地址;在多继承环境下,会存在多个虚函数表指针,分别指向对应 不同基类的虚函数表。

3、C++的set与map的实现方式?以及map的find函数返回的类型?

set与map的底层实现是平衡二叉树红黑树来实现的,unordered_map与unordered_set的底层实现是哈希表;

map的find函数返回的类型迭代器类型;

 

 

 

日积月累,与君共进,增增小结,未完待续。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值