Представление take_view позволяет взять определенное количество элементов. Для создания представления применяется конструктор std::ranges::take_view, в который передается контейер и количество пропускаемых элементов:
#include <iostream>
#include <string>
#include <vector>
#include <ranges>
int main()
{
std::vector<std::string> people { "Tom", "Bob", "Alice", "Sam", "Kate" };
// берем 3 элемента
auto view = std::ranges::take_view{people, 3};
for(const auto& person: view)
{
std::cout << person << std::endl;
}
}
В данном случае берем из контейера people три первых элемента:
auto view = std::ranges::take_view{people, 3};
Консольный вывод:
Tom Bob Alice
В качестве альтернативы можно использовать функцию std::views::take(), которая принимает количество пропускаемых элементов:
#include <iostream>
#include <string>
#include <vector>
#include <ranges>
int main()
{
std::vector<std::string> people { "Tom", "Bob", "Alice", "Sam", "Kate" };
// берем 3 элемента
auto view = people | std::views::take(3);
for(const auto& person: view)
{
std::cout << person << std::endl;
}
}
Для создания представления используем операцию |, которая применяется к контейнеру и функции std::views::take
view = people | std::views::take(3);
Представление take_while_view позволяет получить все элементы, которые соответствуют некоторому условию. Условие задается в виде функции,
которая принимает элемент контейнера и возвращает true, если элемент соответствует условию, и false, если не соответствует.
Для создания представления может применяться конструктор std::ranges::take_while_view, который принимает контейнер и функцию-условие:
#include <iostream>
#include <string>
#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::take_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, из контейнера будут извлекаться элементы. Консольный вывод:
Tom Bob
То есть извлекаюься не вообще все элементы, которые соответствуют условию, а все элементы до первого, который не соответствует условию.
В качестве альтернативы для создания представления можно использовать функцию std::views::take_while(), которая принимает функцию-условие:
#include <iostream>
#include <string>
#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::take_while(condition);
for(const auto& person: view)
{
std::cout << person << std::endl;
}
}