C++11 基于数组的哈希:自动不循环

C++11 Array based Hash: Auto not looping

请注意这是家庭作业,但我们被允许并鼓励寻求帮助,因为我们的单身教授没有时间回复所有学生。 如果您不喜欢由于这个问题的家庭作业性质,为了提供帮助,请不要回答而不是标记为寻求帮助。我不想让我的家庭作业为我完成。我只是想帮助了解我的错误所在。感谢所有帮助!

我正在处理基于数组的哈希 table。我在散列中有一些值,我想检查散列中所有元素的长度总和。哈希中的元素是字符串。

我正在使用以下代码遍历散列中具有值的每个成员...

for (auto iter : myHash) {
        //count up the length of all the strings
        countOfItems += iter.length();
        cout << iter << " ";
    }

问题是代码永远不会循环——一次也没有。它永远不会达到 countOfItems += iter.length();

我调试了这个问题并尽我所能进入我的迭代器,但仍然迷路了。我将 post 这里的迭代器...

template <typename KEY, typename VALUE>
arrayHashIterator<KEY, VALUE> arrayHashTable<KEY, VALUE>::begin() const {

    arrayHashIterator<KEY, VALUE> temp;
    temp.keyArray = this->keyArray;
    temp.valueArray = this->valueArray;
    temp.statusArray = this->statusArray;
    temp.index = 0;
    temp.arraySize = this->arraySize;
    temp.offTheRightEdge = false;

    if (temp.statusArray[0] != 1) {
        //Go search for the first index that contains useful data
        ++temp;
    }
    return temp;
}

当代码到达重载的 ++ 运算符时,它会转到另一个 class...

template <typename KEY, typename VALUE>
arrayHashIterator<KEY, VALUE> arrayHashIterator<KEY, VALUE>::operator++() {

    for(index; index < arraySize; index++){
        if(statusArray[index] == 1)
        {
            offTheRightEdge = false;
            return *this;
        }
    }
    offTheRightEdge = true;
    return *this;
}

现在,当我调试并逐步执行代码时,它正确地到达重载的 ++ 运算符,然后找到第一个存储值的索引,然后 returns arrayHashIterator 对象到 begin()反过来 returns 它回来了。我希望它有一些东西可以进入 (Auto iter: Hash) 循环,但它没有。

我确实有一个用于 arrayHashIterator class 的重载 * 运算符,如下所述...

template <typename KEY, typename VALUE>
VALUE& arrayHashIterator<KEY, VALUE>::operator*() const{

    if(offTheRightEdge == true){
        throw Error();
    }
    return valueArray[index];
}

我几乎是肯定的我已经正确地将元素输入到我的散列中,因为如果我在调试器中打开我的数组以获取值以及键和状态,我会发现所有信息都以正确的形式出现在正确的位置.

我只是不知道为什么 (auto iter : hash) 会循环失败。我确实相信问题出在我的重载 ++ 或重载 * 运算符中,但我不能这么确定。

在此问题上的第二双眼睛将不胜感激。我不想要一些有效的即时答案代码,我只是希望能帮助您找到错误以及如何解决它!

编辑:散列 table 和每个用例的检查有很多代码,但我想 post 特定部分到我的问题所在。我可以根据要求详细说明提供的代码。

编辑:这是我的 end() 方法以及重载的 != 运算符...

更新:超载!=

template <typename KEY, typename VALUE>
bool arrayHashIterator<KEY, VALUE>::operator!=(const arrayHashIterator<KEY, VALUE>& right) const {
    //TODO: see if the "this" iterator and the right iterator are not equal.
    //To do this, check both iterators' index values and offTheRightEdge values
    if(this->offTheRightEdge != right.offTheRightEdge || this->index != right.index) {
        return true;
    } else {
        return false;
    }
}

结束()

template <typename KEY, typename VALUE>
arrayHashIterator<KEY, VALUE> arrayHashTable<KEY, VALUE>::end() const {

    arrayHashIterator<KEY, VALUE> temp;
    temp.keyArray = this->keyArray;
    temp.valueArray = this->valueArray;
    temp.statusArray = this->statusArray;
    temp.index = this->arraySize;
    temp.arraySize = this->arraySize;
    temp.offTheRightEdge = true;

    return temp;
}

看起来你的 operator != 真的是 operator ==。在你的调试器中检查它。