如果我尝试编译以下代码,则会出现错误:
vector<string> articles;
articles.push_back("Article 1...");
articles.push_back("Article 2...");
articles.push_back("Article 3...");
articles.push_back("Article 4...");
vector<string>::iterator beg = articles.begin(), end = articles.end();
vector<string>::iterator mid = (end - beg) / 2;
并且仅在中间更改为时编译:
vector<string>::iterator mid = articles.begin() + (end - beg) / 2;
.begin()
在初始化中会发生什么变化?另外,以下代码也不应给出中间点吗? (添加了.begin(),因为没有它就无法编译)
vector<string>::iterator mid = articles.begin() + articles.size() / 2;
它给出相同的结果。
谢谢。
最佳答案
end - beg
提供beg
和end
之间的距离。它是一个数字,而不是迭代器。然后,将其除以2,即可得到该距离的一半。然后,您必须将该距离转换回迭代器。为此,您将其添加到beg
mid = beg + (end - beg) / 2
例如,如果您的 vector 中包含10个元素,则
(end - beg) / 2
将评估为5
。现在,您必须创建一个指向 vector 中第5个元素的迭代器。这是作为beg + 5
完成的。您说对了,可以通过将 vector 大小的一半加到 vector 的开始迭代器上来获得相同的结果,这是正确的。但是,正如您自己说的那样,这是迭代二进制搜索算法的一部分,这意味着它必须在二进制搜索的每次迭代中计算
mid
,而beg
和end
不再指向原始 vector 的开始和结束。这就是beg + (end - beg) / 2
公式是计算中间迭代器的更通用方法的原因。关于c++ - C++迭代器-为什么我必须添加.begin()才能获得二进制搜索中间点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17513843/