C++ C++  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Ranges и представления

Тест проверяет, умеет ли разработчик отличать контейнер от невладеющего ленивого представления. Задания разбирают композицию адаптеров, borrowed_range, dangling, повторный обход и случаи, когда красивая цепочка скрывает дорогое вычисление или ссылку на уже уничтоженные данные.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 25 вопросов, время — 70 минут. Во многих заданиях недостаточно узнать конструкцию: проследите порядок вычислений, время жизни объектов, владение ресурсами и условия, при которых решение остаётся корректным. После завершения откроются правильные ответы, объяснения, общий результат и тематические шкалы.
Вопрос 1 из 25
Что требуется от типа, чтобы он удовлетворял `std::ranges::range`?
C++C++20
template<std::ranges::range R>
void print(R&& range) {
    auto first = std::ranges::begin(range);
    auto last = std::ranges::end(range);
    for (; first != last; ++first) std::cout << *first;
}
Вопрос 2 из 25
Чем sentinel отличается от итератора конца в классическом STL?
C++C++20
struct null_sentinel {};
struct c_string_iterator {
    const char* p;
    char operator*() const { return *p; }
    c_string_iterator& operator++() { ++p; return *this; }
};
bool operator==(c_string_iterator it, null_sentinel) {
    return *it.p == '\0';
}
Вопрос 3 из 25
Что даёт `std::ranges::sort(v, {}, &Person::age)`?
C++C++20
struct Person { std::string name; int age; };
std::ranges::sort(people, {}, &Person::age);
Вопрос 4 из 25
Почему ranges-алгоритм часто удобнее классического аналога?
C++C++20
auto first_long_name = std::ranges::find_if(
    users,
    [](std::string_view name) { return name.size() > 20; },
    &User::name
);
Вопрос 5 из 25
Что означает `std::ranges::sized_range<R>`?
C++C++20
template<std::ranges::sized_range R>
void reserve_for(const R& source, std::vector<Value>& out) {
    out.reserve(std::ranges::size(source));
}

reserve_for(std::array{1,2,3}, output);
Вопрос 6 из 25
Какое свойство типично для view?
C++C++20
auto adults = people
    | std::views::filter([](const Person& p) { return p.age >= 18; })
    | std::views::transform(&Person::name);
Вопрос 7 из 25
Материализует ли `v | std::views::transform(f)` новый vector результатов?
C++C++20
std::vector<int> values{1,2,3};
auto doubled = values | std::views::transform([](int x) {
    std::cout << "transform ";
    return x * 2;
});

// Преобразование выполняется при обходе doubled, а не при его создании.
Вопрос 8 из 25
Почему view часто дёшево передавать по значению?
C++C++20
auto selected = values
    | std::views::drop(10)
    | std::views::take(20);
// selected хранит представление, а не двадцать скопированных элементов
Вопрос 9 из 25
Что делает `std::views::all(r)` для lvalue-контейнера?
C++C++20
std::vector<int> values{1,2,3};
auto view = std::views::all(values);

values[0] = 9;
std::cout << view.front();
Вопрос 10 из 25
Почему тип конкретной цепочки views редко стоит писать вручную?
Вопрос 11 из 25
Какой результат даст цепочка?
C++C++20
#include <iostream>
#include <ranges>
#include <vector>
int main(){
    std::vector<int> v{1,2,3,4};
    auto r = v | std::views::filter([](int x){return x%2==0;})
               | std::views::transform([](int x){return x*2;});
    for(int x:r) std::cout<<x<<" ";
}
Вопрос 12 из 25
Почему перестановка transform и filter может изменить и результат, и стоимость?
Вопрос 13 из 25
Можно ли полагаться, что transform-функция с побочным эффектом вызовется ровно один раз на элемент?
Вопрос 14 из 25
Что может быть дорогим у filter_view?
Вопрос 15 из 25
Как ограничить бесконечный iota_view первыми десятью значениями?
C++C++20
auto first_ten = std::views::iota(0)
               | std::views::take(10);

for (int value : first_ten)
    std::cout << value << ' ';
Вопрос 16 из 25
Какой дефект времени жизни скрыт в возвращаемом filter_view?
C++C++20
auto positives(){
    std::vector<int> v{-1,2,3};
    return v | std::views::filter([](int x){return x>0;});
}
Вопрос 17 из 25
Что такое borrowed_range?
Вопрос 18 из 25
Зачем ranges-алгоритмы иногда возвращают `std::ranges::dangling`?
C++C++20
auto find_zero() {
    return std::ranges::find(std::vector{3, 0, 4}, 0);
}

static_assert(std::is_same_v<decltype(find_zero()), std::ranges::dangling>);
Вопрос 19 из 25
Почему view над `std::initializer_list` опасно сохранять?
C++C++20
auto make_view() {
    std::initializer_list<int> values{1,2,3};
    return values | std::views::drop(1);
}

auto view = make_view();
std::cout << *view.begin();
Вопрос 20 из 25
Как безопасно хранить отфильтрованные данные как поле долгоживущего объекта?
Вопрос 21 из 25
Как проверить, что алгоритм действительно принимает только forward_range?
Вопрос 22 из 25
Как обнаружить повторное выполнение transform?
Вопрос 23 из 25
Какой тест ловит view на уничтоженную базу?
Вопрос 24 из 25
Почему результат pipeline стоит сравнить с простым эталонным циклом?
Вопрос 25 из 25
Что профилировать в длинной цепочке views?

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу