c++ Попарное зацикливание в векторе

Если у меня есть вектор и я хочу проверить все элементы попарно (0, 1), (1, 2), (2, 3), (3, 4) и (4, 0)

int main(){
  vector<int> = {0, 1, 2, 3, 4};
  //...
}

Какие есть способы зациклить последовательность? Мне на ум приходят два:

Сделать дополнительный if внутри,

int main(){
  vector<int> vec = {0, 1, 2, 3, 4};
  for (size_t i = 0; i < vec.size(); ++i){
    if(i != vec.size() - 1){
      foo(vec[i], vec[i+1]);
    } else {
      foo(vec[i], vec[0]);
    }
  }
}

но это увеличивает время выполнения из-за лишней проверки на каждой итерации.

или сделать отдельно дополнительную проверку последнего и первого

int main(){
  vector<int> vec = {0, 1, 2, 3, 4};
  for (size_t i = 0; i < vec.size() - 1; ++i){
    foo(vec[i], vec[i+1]);
  }
  foo(vec[vec.size() - 1], vec[0]);
}

Но это решение мне не нравится из-за того, что последняя строка иногда забывается и выглядит оно не особо элегантно.

Как бы вы посоветовали решить этот вопрос?


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Если порядок пар не важен, то есть такой вариант. Выглядит довольно быстрым из-за простого тела цикла:

// g++ -std=c++11 -pedantic -Wall -Wextra -Werror pairs.cpp

#include <iostream>
#include <vector>

void foo(int a, int b) {
    std::cout << a << ' ' << b << '\n';
}

int main() {
    std::vector<int> vec = {0, 1, 2, 3, 4};
    int prev = vec.back();
    for (int v : vec) {
        foo(prev, v);
        prev = v;
    }
}
$ g++ -std=c++11 -pedantic -Wall -Wextra -Werror pairs.cpp && ./a.out 
4 0
0 1
1 2
2 3
3 4
→ Ссылка