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