3

そのため、導入されて以来、for each反復する in キーワードが大好きSTL collectionsです (私はシンタックス シュガーの大ファンです)。

私の質問は、これらのキーワードを使用して反復できるカスタム コレクションを作成するにはどうすればよいですか?

基本的に、これらのキーワードを使用してコレクションを反復可能にするには、どの APi を公開する必要がありますか?

これが率直に聞こえる場合は申し訳ありませんが、「ブーストを使用する」、「独自のコレクションを作成しないでください」などの応答はしないでください。友よ、知識の追求。それが不可能なら、ねえ、私はそれを処理できます。

また、コレクションに STL イテレータを挿入する必要がないことを非常に望んでいます。

前もって感謝します!

4

2 に答える 2

10

反復可能なデータ構造 ( Range-Based loops ) の適切な説明は次のとおりです。

データ構造を反復可能にするには、既存の STL イテレータと同様に機能する必要があります。

  1. メンバーまたはスタンドアロン関数としてその構造体を操作し、構造体の先頭と末尾に反復子を返すメソッドbeginが必要です。end
  2. 反復子自体は、メンバーまたはスタンドアロン関数として、メソッド、operator*メソッドoperator !=、およびメソッドをサポートする必要があります。operator++

上記の条件はこれにもC++11当てはまりますが、 には を使用しない範囲ベースのループの統合サポートがあることに注意してください。STL上記の同じリンクでそれについて読むことができます。

于 2012-11-15T17:47:43.607 に答える
5

std::for_eachヘッダーで定義されたものについて話しているのか<algorithm>、C++ 11 で導入された範囲ベースの for ループについて話しているのか、あなたの質問からは明確ではありません。

しかし、答えはどちらも似ています。

どちらも、コレクション自体ではなく、反復子を操作します。

だからあなたはする必要があります

  1. STL (実際には C++ 標準) によって課された要件を満たすイテレータ型を定義します。operator++(主なことは、 and operator*、および他のいくつかの操作と typedef を定義する必要があることです)

  2. std::for_eachは 2 はありません。これで完了です。このような 2 つのイテレータを に渡すだけですstd::for_each。範囲ベースの for ループの場合、begin()andend() 関数を介してこれらの反復子のペアを公開する必要があります。

以上です。

唯一のトリッキーな部分は、要件に準拠するイテレータを実際に作成することです。Boost (使用したくないと言っていましたが) には、カスタム イテレータ (Boost.Iterator) の実装を支援するライブラリがあります。std::iteratorカスタム反復子実装の基本クラスとして意図されたクラスもあります。しかし、どちらも必要ありません。どちらも、独自のイテレータを簡単に作成できる便利なツールです。

于 2012-11-15T17:47:36.447 に答える