【问题标题】:Let iter be an std::iterator. Is there any difference between std::next(iter,1) and ++iter?令 iter 为 std::iterator。 std::next(iter,1) 和 ++iter 之间有什么区别吗?
【发布时间】:2020-03-08 15:46:59
【问题描述】:

请考虑以下代码:

#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 产生相同的输出。总是这样吗?

【问题讨论】:

    标签: c++ iterator


    【解决方案1】:

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

    仅举一个可能重要的例子,假设我们要打印范围的第二个元素,我们不能写像++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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 一些迭代器可能不支持++,但仍可以使用std::nextstd::advance
      • @JesperJuhl 我认为所有迭代器都必须支持++,这不是真的吗?不过,它不一定适用于右值。
      猜你喜欢
      • 2020-04-20
      • 1970-01-01
      • 2021-12-19
      相关资源
      最近更新 更多