Представление 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; } }