【问题标题】:C++ Iterator classC++ 迭代器类
【发布时间】:2014-09-23 21:20:36
【问题描述】:
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;           
    }
};

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

【问题讨论】:

  • 我只是假设 mTiles 是一个向量,那么如果你使用大于大小的 pos 调用构造函数,那么迭代器上的所有 以下 操作都会崩溃。此外,对向量的任何更改(例如删除元素)都会(可能)使其爆炸。

标签: c++ class iterator


【解决方案1】:

您正在进入一个无限循环,因为您的 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&lt;CTile&gt;&amp;,调用者可以根据需要进行复制。

【讨论】:

    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2018-03-26
    • 2012-07-01
    • 1970-01-01
    相关资源
    最近更新 更多