C ++迭代器 - 为什么我必须添加.begin()来获得二进制搜索中间点?

时间:2013-07-07 16:14:13

标签: c++ iterator

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

  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;

并且仅在我将mid改为:

时进行编译
  vector<string>::iterator mid = articles.begin() + (end - beg) / 2;

初始化中.begin()的变化是什么?

另外,下面的代码不应该给出中间点吗? (添加了.begin()因为没有它就不能编译)

  vector<string>::iterator mid = articles.begin() + articles.size() / 2;

它给出了相同的结果。

感谢。

1 个答案:

答案 0 :(得分:5)

end - beg为您提供begend之间的距离。它是一个数字,而不是迭代器。然后你将它除以2得到那个距离的一半。然后你必须将该距离转换回迭代器。为此,您将其添加到beg

mid = beg + (end - beg) / 2

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

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

相关问题