簡素な繰り返し

Pythonのようなrangeを使った簡素な整数計数による繰り返しの方法を実装することがC++でも可能である.これは,に記載の通り,iotaというものを使う.簡単には,次のとおりである.

#include <ranges> #include <iostream> int main(){ for(int i: std::views::iota(1, 16)){ std::cout << i << " "; } std::cout << "\n"; return 0; }

コンパイルから実行までの結果を,ファイル名をt.cppとして,以下に示す.オプションに-std=c++20と指定する必要がある.

hiroki@hiroki-home:~/git/cpp$ g++ t.cpp -std=c++20 hiroki@hiroki-home:~/git/cpp$ ./a.out 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

次のように自分で作ることもできる.作ったことがない場合は,勉強のために一瞥しておくことを勧める.この方法を知っていれば,整数値以外の繰り返しも簡単に記述できるようになるため,コード作成の幅が広がるはずである.

#include <iostream> // Minimum required for range-for loop struct range { int64_t p; int64_t pE; range(int64_t i, int64_t s){ p = i; pE = s; } range(int64_t s){ p = 0; pE = s; } int64_t& operator*() { return p; } bool operator != (const range& a) { return p != a.p; } void operator ++() { ++p; } range begin() const { return range(0, 0); } range end() const { return range(pE, 0); } }; int main(){ std::cout << "Two arguments example\n"; for(auto i: range(0, 4)){ std::cout << i << "\n"; } std::cout << "One argument example\n"; for(auto i: range(8)){ std::cout << i << "\n"; } }

実行結果は次のとおりである.

hiroki@hiroki-home:~/git/cpp$ g++ t.cpp hiroki@hiroki-home:~/git/cpp$ ./a.out Two arguments example 0 1 2 3 One argument example 0 1 2 3 4 5 6 7

for と : を組み合わせた繰り返しに指定可能なオブジェクトは,begin, end, operator!=, operator*,operator++が実装されていなければならない.具体的には,以下のコードが動作するようなクラス A であれば,forと:による繰り返し対象として指定することができる.

int main(){ std::cout << "\nDefinition example\n"; auto r = A(); auto s = r.begin(); auto e = r.end(); while(s != e){ int i = *s; ++s; } std::cout << "\n"; return 0; }

整数の繰り返しのためのrangeについては,C++の標準で提供されるiotaを用いればよいが,それ以外の自作クラスに対し繰り返しを行うような実装をおこなう場合は,この方法を使う必要がある.この機能をIteratorと呼ぶ.