Есть стандартный вектор, допустим типа std::vector<int>. Есть функция void plusOne(std::vector<int>::iterator it1, std::vector<int>::iterator it2), прибавляющая всем элементам между первым (на который указывает it1) и последним (на который указывает it2) единицу. Можно написать перегруженную функция void plusOne(std::vector<int>), которая будет делать то же самое с целым вектором.
Есть ли способ заставить второй вариант функции работать с частью вектора (кроме очевидного и неэффективного: создать временный вектор, скопировать туда нужные значения, обработать, скопировать новые значения в старое место)?
Концепция итераторов для этого и предназначена. Если для вас это не удобно, есть range-v3 (примеры), view::slice позволяет взять произвольную часть диапазона как единую структуру.
Пример:
using namespace ranges;
auto input_range = view::ints(1) | view::transform([](int i){return i*i;});
auto output_range = input_range| view::take(10);
int sum = accumulate(output_range, 0);
Создает диапазон от 1 до бесконечности, лениво возводит элементы в квадрат и берёт первые десять элементов от результата (т.е. как раз кусок диапазона как единую структуру).
Edit: Если вам нужно передать диапазон в функцию, приходится передавать его как шаблон. Со статическими проверками есть проблема, пока что это выглядит примерно так:
template<class Rng,
CONCEPT_REQUIRES_(Range<Rng>())>
void my_algorithm(Rng && rng)
{
return my_algorithm(ranges::begin(rng), ranges::end(rng));
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости