Пусть iter будет std :: iterator. Есть ли разница между std :: next (iter, 1) и ++ iter? - PullRequest
2 голосов
/ 08 марта 2020

Пожалуйста, рассмотрите следующий код:

#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 дают одинаковый результат. Это всегда так?

Ответы [ 2 ]

3 голосов
/ 08 марта 2020

В вашем коде нет разницы. Оба будут продвигать итератор на один шаг.

Просто для примера, где это может иметь значение, скажем, мы хотим напечатать второй элемент диапазона, мы не можем написать что-то вроде ++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());
}

Если мы раскомментируем первую строку вывода, g cc говорит

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

Живой пример

0 голосов
/ 08 марта 2020

Да iter = std::next(iter, 1) эквивалентно ++iter.

Единственное отличие между std::next(iter, 1) и ++iter, о котором я могу думать, это то, что std::next не изменяет итератор, он возвращает копию результирующего итератора.

Также std::next очень полезен в контексте generi c, где iterator может быть random access, forward et c. он будет использовать наиболее подходящий способ для продвижения итератора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...