カスタム型での「範囲ベースの for ループ」の使用
カスタム型の統合
カスタム型で「範囲ベースの for ループ」を有効にするには、以下:
名前空間考慮事項
戻り値の要件
によって返されるオブジェクトbegin() と end() は実際のイテレータである必要はありません。これらは次の要件を満たす必要があります:
分離型
C 17 では、begin と終わりは切り離されました。これにより、終了イテレータが開始イテレータとは異なる型を持つことが可能になります。これは、begin イテレータ型の != のみをサポートする「センチネル」イテレータに役立ち、null で終了する char バッファに対する効率的な反復を可能にします。
ライブラリ拡張の例
ライブラリの種類を考慮するsome_struct_you_do_not_control には整数のベクトルが含まれていますが、begin() メソッドと end() メソッドがありません。
namespace library_ns { struct some_struct_you_do_not_control { std::vector<int> data; }; }
この型は反復可能であるため、次の関数を追加できます。 library_ns 名前空間:
namespace library_ns { int* begin(some_struct_you_do_not_control& x){ return x.data.data(); } int* end(some_struct_you_do_not_control& x){ return x.data.data()+x.data.size(); } int const* cbegin(some_struct_you_do_not_control const& x){ return x.data.data(); } int* cend(some_struct_you_do_not_control const& x){ return x.data.data()+x.data.size(); } int const* begin(some_struct_you_do_not_control const& x){ return cbegin(x); } int const* end(some_struct_you_do_not_control const& x){ return cend(x); } }
これで、範囲ベースの for ループを使用してベクトルを反復処理できます:
library_ns::some_struct_you_do_not_control s; for (int i : s) { // ... }
カスタム タイプの例
制御するカスタム タイプについては、 type: 内で直接 begin() および
end()struct egg_carton { std::vector<egg> eggs; auto begin() { return eggs.begin(); } auto end() { return eggs.end(); } // ... };メソッド
以上がC で範囲ベースの For ループを使用してカスタム型を反復可能にするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。