首页 文章

使用迭代器 - C找到矢量的中间元素

提问于
浏览
4

我有两个问题 .

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 回答

  • 6

    表达式 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) .

  • 1

    使用代码:

    auto mid = vi.begin() + vi.size() / 2;
    

    使 mid 成为中间元素的迭代器 .

    auto mid = (vi.begin() + vi.size()) / 2;
    

    没有意义,因为迭代器不实现除法 .

    代码 vi.begin() + vi.size() 将迭代器返回到last-the-end元素( v.end() ),该元素不应除以2 .

相关问题