Namaran

Code daily. Without assist.

2026-09-14

countdown_range.cpp

#include <iostream>

struct Countdown {
    int n;
    // write this: the members that make the loop below work
};

int main() {
    for (int i : Countdown{3})
        std::cout << i << ' ';  // prints: 3 2 1
}

mainの範囲for文がコンパイルでき、3 2 1 を出力するように、Countdownに必要最小限のメンバーを書き足してください。標準ライブラリのコンテナやビューは使わないこと。

Reference
struct Countdown {
    int n;

    struct iterator {
        int i;
        int operator*() const { return i; }
        iterator& operator++() { --i; return *this; }
        bool operator==(const iterator&) const = default;
    };

    iterator begin() const { return {n}; }
    iterator end() const { return {0}; }
};

範囲for文が要求するのはbegin()/end()(メンバーか、ADLで見つかる非メンバー)と、その戻り値への!=・前置++・単項*だけです。iterator_traitsなどは要りません。展開後のコードが使うのは!=ですが、C++20以降はa != b!(a == b)に書き換えて解決されるので、operator=== defaultで1つ用意すれば足ります。これは参考実装であり、唯一の正解ではありません。