C++迭代程序-为什么我必须添加.begin()才能获得二进制搜索的中点

C++ Iterators - Why do I have to add .begin() to get binary search middle point?

本文关键字:二进制 搜索 为什么 程序 迭代 begin 添加 C++      更新时间:2023-10-16

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

  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;

它给出了相同的结果。

谢谢。

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

mid = beg + (end - beg) / 2

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

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