Как перебрать вектор c ++ и работать с двумя значениями одновременно, используя библиотеку range-v3? - PullRequest
1 голос
/ 17 марта 2020

Допустим, у меня есть вектор чисел:

std::vector< int > v{ 1, 2, 3, 4 };

Я хочу перебирать вектор и оперировать двумя одновременно; то есть я хочу оперировать:

  • (1,2),
  • (2,3) и
  • (3,4).

Я знаю, что есть способ сделать это, используя библиотеку Eri c Neibler range-v3 (планируется в C ++ 20), но я не могу вспомнить точную последовательность команд.


Я мог бы сделать это с помощью итераторов

for( auto begin = v.begin(); begin != (v.end()-1); begin++ ){
  // Do something with *begin and *(begin+1)
}

Использование библиотеки range-v3 сделало бы это намного более элегантным и читабельным. Я просто не могу вспомнить, что это за команда.

1 Ответ

1 голос
/ 17 марта 2020

В библиотеке Эри c Ниблера это называется скользящим представлением ( живой пример ):

using namespace ranges;
std::vector< int > v{ 1, 2, 3, 4 };

for (const auto& p : v | views::sliding(2)) {
    std::cout << p[0] << ' ' << p[1] << '\n';
}

Не думаю, что это конкретное представление включено в C ++ 20 из коробки, но я полагаю, что в будущем у нее есть все шансы. К сожалению, zip_view пришлось вырезать из P1035 , поэтому "каноническая" реализация через zip (сжатие диапазона с самим собой без первого элемента), вероятно, будет также немного более сложной.

...