C++ 迭代器类

C++ Iterator class

本文关键字:迭代器 C++      更新时间:2023-10-16
class ZoningIter
{
private:
    CTile::Zonings mZoning;
    CCity *mCity;
    int mPos;       ///< Position in the collection
public:
    ZoningIter(CCity *tile, int pos, CTile::Zonings zoning) : mCity(tile), mPos(pos), mZoning(zoning) 
    {       
        while (mPos < mCity->mTiles.size())
        {
            if (mCity->mTiles[mPos]->GetZoning() == mZoning)
                break;
            else
                mPos++;
        }       
    }
    bool operator!=(const ZoningIter &other) const
    {
        return mPos != other.mPos;
    }
    std::shared_ptr<CTile> operator *() const
    {               
        return mCity->mTiles[mPos]; 
    }
    const ZoningIter& operator++()
    {                       
        auto size = mCity->mTiles.size();
        auto myzone = mCity->mTiles[mPos]->GetZoning();
        while (mPos < size-1)
        {
            ++mPos;
            if (mCity->mTiles[mPos]->GetZoning() == mZoning)
                break;
        }   
        return *this;           
    }
};

不知道我在这个迭代器中做错了什么。这个类迭代器应该遍历类 CCity 并将返回的磁贴与我正在寻找的磁贴进行比较。我可以看到它遇到无限循环的一个问题,不确定如何解决它?有什么想法吗?

您遇到了无限循环,因为您的operator++不会递增到所有元素(也称为结束迭代器(中的一个。

while (mPos < size-1) // <-- This line is wrong, stops too early

它会屏蔽您之后执行的成功检查中的错误。

无论如何,它应该

从增量开始,然后检查它是否可以并且应该循环。
更正后的版本,删除了两个错误:

const ZoningIter& operator++() {
    while( ++mPos < mCity->mTiles.size()
        && mCity->mTiles[mPos]->GetZoning() != mZoning)
        {}
    return *this;
}

此外,operator*()的返回类型应const std::shared_ptr<CTile>&,调用方可以根据需要制作副本。