Работа с частью вектора как с вектором

306
13 октября 2017, 16:12

Есть стандартный вектор, допустим типа std::vector<int>. Есть функция void plusOne(std::vector<int>::iterator it1, std::vector<int>::iterator it2), прибавляющая всем элементам между первым (на который указывает it1) и последним (на который указывает it2) единицу. Можно написать перегруженную функция void plusOne(std::vector<int>), которая будет делать то же самое с целым вектором.

Есть ли способ заставить второй вариант функции работать с частью вектора (кроме очевидного и неэффективного: создать временный вектор, скопировать туда нужные значения, обработать, скопировать новые значения в старое место)?

Answer 1

Концепция итераторов для этого и предназначена. Если для вас это не удобно, есть 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));
}
READ ALSO
Как ссылаться на DLL в решении в VS?

Как ссылаться на DLL в решении в VS?

В VS2013 есть решение с проектами на С++Один главный, а остальные планируется оформить в виде динамических библиотек

322
Базовый класс Фигура

Базовый класс Фигура

Базовый класс Фигура с полем «название фигуры» и методом «Печать названия»Производный класс Шар с полем Радиус

270
Олимпиадная задача проходит на 80%

Олимпиадная задача проходит на 80%

Определить координаты малейшего интервала с целочисленными координатами концов, на который приходятся значения элементов действительной...

200
Запись чисел из файла в массив типа int

Запись чисел из файла в массив типа int

Встал перед вопросом, как считать числа из текстового файла напрямую в массив

592