Есть стандартный вектор, допустим типа 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));
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
В VS2013 есть решение с проектами на С++Один главный, а остальные планируется оформить в виде динамических библиотек
Базовый класс Фигура с полем «название фигуры» и методом «Печать названия»Производный класс Шар с полем Радиус
Определить координаты малейшего интервала с целочисленными координатами концов, на который приходятся значения элементов действительной...
Встал перед вопросом, как считать числа из текстового файла напрямую в массив