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つ用意すれば足ります。これは参考実装であり、唯一の正解ではありません。