Мне нужно выполнить довольно сложный фрагмент кода в цикле, но цикл либо над вектором, либо над числовым диапазоном целых чисел. Решение о типе цикла принимается во время выполнения:
if(!int_vector_provided){
for(int i=0;i<N;++i){ // iterate over a numeric range
// complex code depending on i
}
} else {
for(int i: int_vector){ // iterate over a vector
// the same complex code
}
}
Проблема в том, что «сложный код» трудно преобразовать в функцию, поскольку он зависит от множества локальных и глобальных переменных. Также нежелательно делать этот код захватывающей лямбдой, так как эта часть критична для производительности. Если используется числовой диапазон, то он обычно очень велик (миллионы), поэтому очень неэффективно создавать вектор последовательных чисел такого размера.
На самом деле мне нужна пара итераторов, которые могут быть назначены либо началу/концу вектора, либо началу/концу числового диапазона. Что-то типа:
SomeCleverIterator b,e;
if(int_vector_provided){
b = int_vector.begin();
e = int_vector.end();
} else {
// Iterators to numeric range
// may be boost::counting_range(0,N) ???
// but how to make boost::range iterators and
// to vector<int>::iterator convertible to the same type??
b = ???;
e = ???;
}
for(SomeCleverIterator it=b;it!=e;it++){
// complex code
}
Я пытался поиграть с boost::counting_range
, но его итераторы не конвертируются в vector<int>::iterator
, так что это не помогает.
Единственный способ, который я вижу, это создать собственный шаблон класса с итераторами и явно создать его экземпляр для вектора и пары целых чисел, но это выглядит излишним для такой «тривиальной» проблемы.
Есть ли лучший способ?
int_vector_provided
должно быть 2 отдельные функции, а сложная часть кода должна быть извлечена во вспомогательную встроенную функцию. Или предоставьте минимально воспроизводимый пример, подробно объясняющий вашу ситуацию. - person rustyx   schedule 02.02.2020