2011-08-16 20 views
2

コレクション型のC++実装を作成しました。 開発者が "for each"ステートメントを使用できるように反復サポートを追加したいと思います。 どうすればいいですか?あなたの論理コンテナ内の最初と1-過去のエンドポイントへのイテレータ:foreach反復サポートをC++の自分のコレクションクラスに追加するにはどうすればよいですか?

+4

C++にはforeach文がありません。 foreachを行うC++ 11のforループのタイプがあります - それはどういう意味ですか?あなたはforループで使うことができるという意味ですか?またはBOOST_FOREACHを見ていますか? –

+0

私はVisual Studio 2008にforeachが実装されていると思います – James

+0

私はそれをここで見ました...それはC++でしかないことを認識していませんでした。 http://msdn.microsoft.com/en-us/library/ms177203.aspx Microsoft! –

答えて

5

標準イディオムがある:ようなタイプiteratorconst_iteratorを公開し、最低限の二つの機能、すなわち、begin()end()を提供:

template</*.....*/> 
class Collection 
{ 
public: 
    typedef /*...*/ iterator; 
    typedef /*...*/ const_iterator; 

    iterator begin(); 
    iterator end(); 

    const_iterator begin() const; 
    const_iterator end() const; 
}; 

あなたはこれらを実装したら、あなたのコレクションはstd::for_eachで、ロットで使用することができます<algorithm>で定義されている他のアルゴリズム関数。

+0

これはC++専用ですか。 –

+0

気にしないで、std :: for_eachを書いたことを実現しました。 –

+0

@Che:これは標準のC++です。 foreachはC++/CLIになります... – MFH

1

あなたがfor_eachアルゴリズムを意味すると仮定すると、あなただけの標準beginendコンテナメソッドを表し何かが必要。

1

STLのfor_eachアルゴリズムを意味する場合、STLコンテナのようにbegin()end()を定義する必要があります。

C++ 0xの範囲ベースのforループを意味する場合は、同じことを行うことができます。

0
using namespace std; 

// very very simple container class 
class Cont { 
public: 
    Cont() {} 
    typedef char* iterator; 
    iterator begin() {return arr;} 
    iterator end() {return &arr[200];} 

private: 
    char arr[200]; 
}; 

void setit(char &it) { 
    it = 'a'; 
} 
// iterator must provide ++ operation for for_each algorithm (char* in this example works this way) 
int main() { 
    Cont c; 
    for_each(c.begin(), c.end(), setit); 
    copy(c.begin(), c.end(), ostream_iterator<char>(cout, ",")); 
    return 0; 
} 
関連する問題