0

私はC ++プログラミングの初心者で、イテレータを作成する必要がありますが、要素を認識しないため、ループ(c ​​++ 11)に問題があります。説明します:

class myclass{
    std::string str;
    myclass();
    std::iterator<(what do i have to put here?), char, diffptr_t, char*, char&> begin(){
       return str.begin();
    }
}

これは、クラスを読み取るメソッドです。

 void func(myclass& m){
     for(char a: m){ //Here's the problem, i don't know why it doesn't work
         //do function  
     }

どの体がそれを行うための最良の方法であるかを知ることができますか?? ここで何が問題なのですか?

4

2 に答える 2

1

少なくとも私があなたの質問を正しく理解していれば、次のようなものが必要です。

class myclass { 
    std::string str;
public:
    std::string::iterator begin() { return str.begin(); }
    std::string::iterator end() { return str.end(); }
};

void func(myclass &m) { 
    for (auto a : m)
        // ...
}
于 2013-08-17T16:00:58.090 に答える
1

からイテレータを返すだけの場合は、次のstd::stringようなことができるはずです。

auto begin() -> decltype(str.begin())
{
    return str.begin();
}

単純な反復子は、実際には非常に単純です。独自のタイプの別の反復子と比較できる必要があり、少なくともプレフィックスインクリメント演算子 (範囲ベースの for ループが機能するため) と、もちろん逆参照操作が必要です。それはそれについてです。

あなたの場合、それは次のようなものかもしれません

class iterator
{
    friend myclass;  // So that only `myclass` can construct this

public:
    bool operator==(const iterator& other) const
    {
        // Implement comparison
    }

    iterator& operator++()
    {
        // Increment
        return *this;
    }

    char& operator*() const
    {
        // Return a reference to the "current" character
    }

    friend bool operator!=(const iterator& i1, const iterator& i2)
    {
        return !(i1 == i2);
    }

private:
    iterator(...) { ... }

    // Put the actual iterator here (e.g. `std::string::iterator`)
};
于 2013-08-17T16:02:04.890 に答える