C++Primer 练习3.26中的为什么?
1. 练习3.26问题了解
问题:在下面的二分搜索程序中,为什么用的是mid = beg+(end-beg)/2,而非mid=(beg+end)/2; ?
int main() {
std::vector<int> text{1,2,3,4,5,6,7,8,9,10}; //text是有序的
auto beg=text.begin(),end=text.end();
auto mid=beg+(end-beg)/2;
int sought=5; //搜索值
while(mid!=end && *mid!=sought)
{
if(sought<*mid)
end=mid;
else
beg=mid+1;
mid=beg+(end-beg)/2;
}
}
2. 解答问题
1.首先第一种写法与第二种数学上得到的结果是完全一样的,但是beg+end这一步操作很可能会出现整数溢出的风险,但是后一种写法不会出现比end要大的中间数据,所以比较安全。
2.考虑了通用性,用第二种如果beg和end是指针或者迭代器的话是无法编译通过的,因为指针和迭代器运算不支持相加运算,却支持相减运算,所以第一种通用性强。(迭代器的话要求是随机访问迭代器random access iterator)。
----------------------------------我已经到底了---------------------------------