Пропуск элементов. drop и drop_while

Последнее обновление: 31.03.2023

drop_view

Представление drop_view позволяет пропустить определенное количество элементов. Для создания представления применяется конструктор std::ranges::drop_view, в который передается контейер и количество пропускаемых элементов:

#include <iostream>
#include <vector>
#include <ranges>

int main()
{
    std::vector<std::string> people { "Tom", "Kate", "Bob", "Alice", "Sam" };
    // пропускаем 2 элемента
    auto view = std::ranges::drop_view{people, 2};

    for(const auto& person: view)
    {
        std::cout << person << std::endl;
    }
}

В данном случае пропускаем два первых элемента из контейера people:

auto view = std::ranges::drop_view{people, 2};

Консольный вывод:

Bob
Alice
Sam

В качестве альтернативы можно использовать функцию std::views::drop(), которая принимает количество пропускаемых элементов:

#include <iostream>
#include <vector>
#include <ranges>

int main()
{
    std::vector<std::string> people { "Tom", "Kate", "Bob", "Alice", "Sam" };
    // пропускаем 2 элемента
    auto view = people | std::views::drop(2);

    for(const auto& person: view)
    {
        std::cout << person << std::endl;
    }
}

Для создания представления используем операцию |, которая применяется к контейнеру и функции std::views::drop

view = people | std::views::drop(2);

Пропуск элементов по условию

Представление drop_while_view позволяет пропустить первые элементы, которые соответствуют некоторому условию. Условие задается в виде функции, которая принимает элемент контейнера и возвращает true, если элемент соответствует условию, и false, если не соответствует.

Для создания представления может применяться конструктор std::ranges::drop_while_view, который принимает контейнер и функцию-условие:

#include <iostream>
#include <vector>
#include <ranges>

int main()
{
    std::vector<std::string> people { "Tom", "Bob", "Alice", "Sam", "Kate" };
    auto condition = [](const std::string& s) {return s.length()==3; };

    auto view = std::ranges::drop_while_view{people, condition};

    for(const auto& person: view)
    {
        std::cout << person << std::endl;
    }
}

В данном случае условие представляет функцию, которая принимает строку и возвращает true, если длина строки равна 3 символам:

auto condition = [](const std::string& s) {return s.length()==3; };

В итоге пока условие не возвратить false, из контейнера будут пропускаться элементы. Консольный вывод:

Alice
Sam
Kate

То есть пропускаются не вообще все элементы, которые не соответствуют условию, а все элементы до первого, который не соответствует условию.

В качестве альтернативы для создания представления можно использовать функцию std::views::drop_while(), которая принимает функцию-условие:

#include <iostream>
#include <vector>
#include <ranges> 

int main()
{
    std::vector<std::string> people { "Tom", "Bob", "Alice", "Sam", "Kate" };
    auto condition = [](const std::string& s) {return s.length()==3; };
     
    auto view = people | std::views::drop_while(condition);

    for(const auto& person: view)
    {
        std::cout << person << std::endl;
    }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850