如果我尝试编译以下代码,则会出现错误:

  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提供begend之间的距离。它是一个数字,而不是迭代器。然后,将其除以2,即可得到该距离的一半。然后,您必须将该距离转换回迭代器。为此,您将其添加到beg

mid = beg + (end - beg) / 2

例如,如果您的 vector 中包含10个元素,则(end - beg) / 2将评估为5。现在,您必须创建一个指向 vector 中第5个元素的迭代器。这是作为beg + 5完成的。

您说对了,可以通过将 vector 大小的一半加到 vector 的开始迭代器上来获得相同的结果,这是正确的。但是,正如您自己说的那样,这是迭代二进制搜索算法的一部分,这意味着它必须在二进制搜索的每次迭代中计算mid,而begend不再指向原始 vector 的开始和结束。这就是beg + (end - beg) / 2公式是计算中间迭代器的更通用方法的原因。

关于c++ - C++迭代器-为什么我必须添加.begin()才能获得二进制搜索中间点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17513843/

10-11 04:35