首页 > 解决方案 > 令 iter 为 std::iterator。std::next(iter,1) 和 ++iter 之间有什么区别吗?

问题描述

请考虑以下代码:

#include <iostream>
#include <iterator>
#include <vector>

int main() 
{
    std::vector<int> v{1,2,3};

    // implementation 1:
    for(auto iter = v.begin(); iter !=v.end(); ++iter)
        std::cout << *iter;
    std::cout << std::endl;

    // implementation 2:
    for(auto iter = v.begin(); iter !=v.end(); iter = std::next(iter, 1))
        std::cout << *iter;
    std::cout << std::endl;       
}

正如您在此处看到的,实现 1 和实现 2 产生相同的输出。总是这样吗?

标签: c++iterator

解决方案


在您的代码中没有区别。两者都会使迭代器前进一步。

举一个可能很重要的例子,假设我们要打印范围的第二个元素,我们不能写这样的东西,++b.begin()因为我们不能应用于++右值。

这里有一个代码示例。

#include <array>
#include <iostream>

int main()
{
    std::array<int, 2> a = {2, 4};

    //std::cout << *(++a.begin()); // This will fail
    std::cout << *std::next(a.begin());
}

如果我们取消注释第一条输出行 gcc 说

prog.cc: In function 'int main()':
prog.cc:8:29: error: lvalue required as increment operand
    8 |     std::cout << *(++a.begin());
      |                      ~~~~~~~^~

活生生的例子


推荐阅读