ホームページ > バックエンド開発 > C++ > C で範囲ベースの For ループを使用してカスタム型を反復可能にするにはどうすればよいですか?

C で範囲ベースの For ループを使用してカスタム型を反復可能にするにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-28 22:06:15
オリジナル
549 人が閲覧しました

How Can I Make My Custom Types Iterable Using Range-Based For Loops in C  ?

カスタム型での「範囲ベースの for ループ」の使用

カスタム型の統合

カスタム型で「範囲ベースの for ループ」を有効にするには、以下:

  • メンバー関数: イテレーターのように動作するオブジェクトを返す begin() および end() メンバー関数を定義します。
  • 無料関数: 無料関数を作成するbegin(Type&)end(Type&) はカスタム型と同じ名前空間を持ち、反復子のように動作するオブジェクトを返します。

名前空間考慮事項

  • カスタム タイプがxml 名前空間では、xml::begin() または xml::end() を定義して、名前空間の正しい関連付けを確保します。

戻り値の要件

によって返されるオブジェクトbegin()end() は実際のイテレータである必要はありません。これらは次の要件を満たす必要があります:

  • pre-を実装し、有効な初期化式を保証します。
  • ブール比較用にバイナリ != を実装します。 .
  • 単項の実装* ループ変数に割り当てる値を提供します。
  • パブリック デストラクターを公開します。

分離型

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&amp; x){ return x.data.data(); }
  int* end(some_struct_you_do_not_control&amp; x){ return x.data.data()+x.data.size(); }
  int const* cbegin(some_struct_you_do_not_control const&amp; x){ return x.data.data(); }
  int* cend(some_struct_you_do_not_control const&amp; x){ return x.data.data()+x.data.size(); }
  int const* begin(some_struct_you_do_not_control const&amp; x){ return cbegin(x); }
  int const* end(some_struct_you_do_not_control const&amp; 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート