C++迭代程序-为什么我必须添加.begin()才能获得二进制搜索的中点
C++ Iterators - Why do I have to add .begin() to get binary search middle point?
如果我试图编译以下代码,会出现错误:
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
提供beg
和end
之间的距离。它是一个数字,而不是迭代器。然后你把它除以2,得到这个距离的一半。然后您必须将该距离转换回迭代器。为此,您将其添加到beg
mid = beg + (end - beg) / 2
例如,如果向量中有10个元素,则(end - beg) / 2
的计算结果将为5
。现在您必须创建一个迭代器,指向向量中的第5个元素。这是作为beg + 5
完成的。
当你说通过将向量大小的一半添加到向量的起始迭代器可以获得相同的结果时,你是对的。然而,正如您自己所说,这是迭代二进制搜索算法的一部分,这意味着它必须在每次二进制搜索迭代中计算mid
,beg
和end
不再指向原始向量的开始和结束。这就是为什么beg + (end - beg) / 2
公式是计算中间迭代器的更通用的方法。
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- 为什么二进制搜索在我的测试中不起作用
- 正在尝试重载二进制搜索树分配运算符
- 我的二进制搜索程序只是关闭了
- 二进制搜索的终止点
- 递归二进制搜索与字符串数组
- 测试树是否为二进制搜索树
- 如何二进制搜索结构向量并在适当的索引处插入
- 如果你有一个固定大小的数组,你需要遍历它!n次,使用二进制搜索如何改变时间复杂性
- 字符串的递归二进制搜索-C++
- 使用二进制搜索树中的迭代器对象访问左侧节点
- 二进制搜索树没有匹配的函数调用
- 二进制搜索不适用于特定输出
- 如何在向量上进行二进制搜索以找到具有特定id的元素
- 二进制搜索树不变的标头文件
- 二进制搜索树插入带参数参考
- 二进制搜索不变以查找元素的首次出现
- 了解一种神秘地起作用的递归二进制搜索算法