使用迭代器查找向量的中间元素 - C++

Nic*_*ick 6 c++ iterator vector

我有两个问题.

第一个问题

我读关于迭代器C++C++ primer 5th edition书.在本书的一个代码示例中,给出了以下代码片段将在向量中找到中间元素vi

auto mid = vi.begin() + vi.size() / 2; 
Run Code Online (Sandbox Code Playgroud)

现在我想问一下,为什么vi.begin()加入vi.size()?会不会vi.size()/2有足够找到矢量中间元素vi

第二个问题

auto mid = vi.begin() + vi.size() / 2;
Run Code Online (Sandbox Code Playgroud)

在此代码段中,如果我vi.begin() + vi.size()像这样添加括号:

auto mid = (vi.begin() + vi.size()) / 2;
Run Code Online (Sandbox Code Playgroud)

它抛出错误 no "/" operator matches these operands...

为什么会抛出这个错误?我问这个是因为逻辑上这个表达式vi.begin() + vi.size()应该首先计算,结果应该除以2.

如果我错了,请纠正我.

You*_*You 7

表达式vi.begin() + vi.size()导致迭代器增加了vi.size()一倍,并且迭代器没有operator/.

第一个代码片段的工作原理是首先计算C++强制规则的运算符优先级规则vi.size() / 2,然后添加此结果(整数),vi.begin()从而将迭代器递增指定的量.

也就是说,潜在的误解vi.begin() + vi.size() / 2是不等于(vi.begin() + vi.size()) / 2,而是vi.begin() + (vi.size() / 2).