使用迭代器查找向量的中间元素 - 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++的主要内容,如果未能解决你的问题,请参考以下文章

C++中的向量迭代器

类元素加入的 C++ 自动迭代器向量

C++:在开始之前不能寻找向量迭代器

对于 C++ Random Access Iterator(向量迭代器),迭代器之间的差异是如何计算的?

迭代器可以在 C++ 中的向量之间共享吗?

使用向量迭代器时的 EXC_BAD_ACCESS?