晚上重新看《STL源码剖析》,看到power的实现时觉得很有意思,遂想记录一下。
一般情况下,在计算power时都会有个初值,通常为1,但泛型算法的值并不一定是POD类型,最常见的是class和struct类型,在处理这一类型时初值则不能为1。
STL中有个很巧妙的处理技巧,规避了这类问题。下面来看代码:
<span style="font-family:KaiTi_GB2312;font-size:18px;">template <class T, class Integer, class MonoidOperation>
T power(T x, Integer n, MonoidOperation op) {
if(n == 0)
return identity_element(op);//可忽略此处
else {
//精华在此:先处理n的二进制后几位为0的情况,
//以解决T是一个不嗯呢该直接赋值为1的类型
while( (n&1) == 0) {
n >>= 1;
x = op(x, x);
}
T result = x;
n >> = 1;
while(n != 0) {
x = op(x, x);
if( (n&1) != 0)
result = op(result, x);
n >> = 1;
}
return result;
}
}</span>