使用迭代器查找向量的中间元素 - C++
Posted
技术标签:
【中文标题】使用迭代器查找向量的中间元素 - C++【英文标题】:Finding middle element of vector using iterator - C++ 【发布时间】:2017-02-01 12:50:23 【问题描述】:我有两个问题。
第一个问题
我正在阅读来自C++ primer 5th edition
书的C++
中的迭代器。在本书的一个代码示例中,给出了下面的代码sn-p会在向量vi
中找到中间元素
auto mid = vi.begin() + vi.size() / 2;
现在我想问一下,为什么vi.begin()
要加在vi.size()
里面? vi.size()/2
不足以找到向量vi
中的中间元素吗?
第二个问题
auto mid = vi.begin() + vi.size() / 2;
在这段代码 sn-p 中,如果我在 vi.begin() + vi.size()
周围添加括号,如下所示:
auto mid = (vi.begin() + vi.size()) / 2;
no "/" operator matches these operands...
会抛出错误
为什么会抛出这个错误?我问这个是因为逻辑上应该首先计算这个表达式vi.begin() + vi.size()
,然后结果应该除以2
。
如果我错了,请纠正我。
【问题讨论】:
vi.begin()
给出了一个迭代器来开始向量。 vi.size()
给出元素的计数(整数)。当您将整数添加到迭代器时,迭代器将向前移动那么多元素。在这里,您向前移动元素总数的一半。
【参考方案1】:
表达式vi.begin() + vi.size()
生成一个迭代器,该迭代器已递增vi.size()
次,而迭代器没有operator/
。
第一个 sn-p 起作用的原因是 the operator precedence rules of C++ 要求首先计算 vi.size() / 2
,然后将其结果(整数)添加到 vi.begin()
从而将迭代器增加指定的数量。
也就是说,潜在的误解是vi.begin() + vi.size() / 2
不等同于(vi.begin() + vi.size()) / 2
,而是等同于vi.begin() + (vi.size() / 2)
。
【讨论】:
好吧,在表达式auto mid = vi.begin() + vi.size() / 2;
中,除法 (vi.size() / 2
) 将按照您的建议在之前完成,因为运算符优先级。因此,它将返回一个迭代器,该迭代器已递增 vi.size() / 2
次。
如果迭代器没有/
运算符,那么为什么auto mid = vi.begin() + vi.size() / 2;
可以工作,而auto mid = (vi.begin() + vi.size()) / 2;
却不行。
@Nick 因为vi.size()
不返回迭代器,它返回一个数字。【参考方案2】:
使用代码:
auto mid = vi.begin() + vi.size() / 2;
使mid
成为中间元素的迭代器。
auto mid = (vi.begin() + vi.size()) / 2;
没有意义,因为迭代器不实现除法。
代码vi.begin() + vi.size()
返回一个指向过去元素 (v.end()
) 的迭代器,该元素不应除以 2。
【讨论】:
以上是关于使用迭代器查找向量的中间元素 - C++的主要内容,如果未能解决你的问题,请参考以下文章