我是C ++的新手。我在网上看到了这个代码,它试图在向量中找到一个字符串。但是,我注意到了最后:
mid = beg + (end - beg) / 2;
为什么必须以这种方式编写,为什么不能写成:
mid = (beg + end) /2
mid = (beg + (end - 1)) / 2
是否可行?
我很难理解背后的原因。
vector<string> text = {"apple", "beer", "cat", "dog"};
string sought = "beer";
auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end - beg) / 2;
while (mid != end && *mid != sought){
if(sought < *mid){
end = mid;
} else {
beg = mid + 1;
}
mid = beg + (end - beg) / 2;
}
答案 0 :(得分:13)
一般情况下,二进制搜索的原因是避免溢出。 beg+end
会因大值而溢出。使用end-beg
可以避免溢出。
想象一下,beg
是MAX_INT-3
而end
是MAX_INT-1
,然后beg+end
会大于MAX_INT
,但是end-beg
,只会是2。
使用迭代器,这也可以解决,因为end-begin
是一个数字,而begin+end
无效。您可以减去两个迭代器以获得它们之间的距离,但是您不能添加两个迭代器。
答案 1 :(得分:4)
添加两个迭代器没有意义,你也做不到。
您可以在两个迭代器上调用operator-
,并给出合理的结果,即两个迭代器之间的元素数。并且您可以在迭代器上添加或减去整数,意味着向前或向后移动它。但是添加两个迭代器应该是什么结果?
mid = beg + (end - beg) / 2;
~~~~~~~~~~ => get the count between beg and end
~~~~~~~~~~~~~~~ => get the half of the count
~~~~~~~~~~~~~~~~~~~~~ => get the iterator pointing to the middle position between beg and end
mid = (beg + end) /2
~~~~~~~~~ => What would the result represent?