1

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

  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;

它给出了相同的结果。

谢谢。

4

1 回答 1

5

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

mid = beg + (end - beg) / 2

例如,如果您的向量中有 10 个元素,则(end - beg) / 2计算结果为5. 现在您必须创建一个指向向量中第 5 个元素的迭代器。这是作为beg + 5.

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

于 2013-07-07T16:15:56.027 回答