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 ==
。在你的调试器中检查它。
请注意这是家庭作业,但我们被允许并鼓励寻求帮助,因为我们的单身教授没有时间回复所有学生。 如果您不喜欢由于这个问题的家庭作业性质,为了提供帮助,请不要回答而不是标记为寻求帮助。我不想让我的家庭作业为我完成。我只是想帮助了解我的错误所在。感谢所有帮助!
我正在处理基于数组的哈希 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 ==
。在你的调试器中检查它。