使其成为std :: iterator。 std :: next(iter,1)和++ iter之间有什么区别吗?

时间:2020-03-08 15:46:59

标签: c++ iterator

请考虑以下代码:

#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;       
}

您可以看到here实现1和实现2产生相同的输出。总是这样吗?

2 个答案:

答案 0 :(得分:3)

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

仅举一个可能有意义的示例,假设我们要打印范围的第二个元素,我们无法编写类似++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());
      |                      ~~~~~~~^~

Live example

答案 1 :(得分:0)

是的iter = std::next(iter, 1)等同于++iter

我能想到的std::next(iter, 1)++iter之间的唯一区别是std::next不会修改迭代器,它会返回结果迭代器的副本。

另外,std::next在通用上下文中非常有用,其中iterator可以是random accessforward等,它将使用最合适的方式来推进迭代器。 >