我有两个问题 .
First question
我在 C++
从 C++ primer 5th edition
书中读到 iterators . 在本书的一个代码示例中,给出了以下代码片段将在向量中找到中间元素 vi
auto mid = vi.begin() + vi.size() / 2;
现在我想问一下,为什么在 vi.size()
中添加 vi.begin()
? vi.size()/2
不足以在向量 vi
中找到中间元素吗?
Second Question
auto mid = vi.begin() + vi.size() / 2;
在此代码段中,如果我在 vi.begin() + vi.size()
周围添加括号,如下所示:
auto mid = (vi.begin() + vi.size()) / 2;
它会抛出错误 no "/" operator matches these operands...
为什么会抛出这个错误?我问这个是因为逻辑上应该首先计算这个表达式 vi.begin() + vi.size()
,结果应该除以 2
.
如果我错了,请纠正我 .
2 回答
表达式
vi.begin() + vi.size()
导致迭代器增加了vi.size()
次,并且迭代器没有operator/
.第一个代码段工作的原因是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)
.使用代码:
使
mid
成为中间元素的迭代器 .没有意义,因为迭代器不实现除法 .
代码
vi.begin() + vi.size()
将迭代器返回到last-the-end元素(v.end()
),该元素不应除以2 .