1.哈希表独立表链地址法中迭代器的设计
*hashTable:哈希表对象的地址
*currentBucket:迭代器遍历的当前桶的索引
*currentLoc:当前哈希表元素
例如:虚线为遍历元素顺序
![](https://img-blog.csdn.net/20130805133025765)
实现代码:
Tips:
可以把哈希表独立表链地址法的结构看成二维数组
#ifndef hashIterator_H
#define hashIterator_H
class hashIterator
{
friend class hashTable<T,hashFun>;
private:
hashTable<T,hashFun> *ptable; //哈希表对象地址
size_t row;//迭代器遍历的当前行的索引
typename list<T>::iterator it; //当前迭代器
hashIterator(hashTable *pt , size_t r ,typename list<T>::iterator i ):
{
for(int i=row+1;i<ptable->rows;i++)//从下一行开始扫描,直到第一个元素非空
{
if(!ptable->table[i].empty())
{
row=i;
it=ptable->table[i].begin(); //返回第一个元素
return;
}
}
row=-1; //返回end()
}
public:
hashIterator(){}
bool operator==(const hashIterator &rh)//等于操作符
{
if(row==-1&&rh.row==-1) // 定义row==-1为end()
return true;
else if(row==rh.row) //如果不是end(),则需比较迭代器
return it==rh.it;
else //定义不同行时不具有比较性
return false;
}
bool operator!=(const hashIterator &rh)//不等于操作符
{
return !operator==(rh);
}
hashIterator& operator++() //前置++
{
if(row==-1) //定义end()不可++
{
cerr<<"end(),can't ++"<<endl;
return *this;
}
it++;
if(it==ptable->table[row].end())
nextRow();
return *this;
}
hashIterator operator++(int) //后置++
{
hashIterator tem(*this);
++*this;
return tem;
}
T& operator*() //解引用操作符
{
if(row==-1)
cerr<<"can't derefference "<<endl;
else
return *it;
}
};
#endif
哈希表迭代器的测试详见
*hashTable:哈希表对象的地址
*currentBucket:迭代器遍历的当前桶的索引
*currentLoc:当前哈希表元素
例如:虚线为遍历元素顺序
实现代码:
Tips:
可以把哈希表独立表链地址法的结构看成二维数组
#ifndef hashIterator_H
#define hashIterator_H
class hashIterator
{
friend class hashTable<T,hashFun>;
private:
hashTable<T,hashFun> *ptable; //哈希表对象地址
size_t row;//迭代器遍历的当前行的索引
typename list<T>::iterator it; //当前迭代器
hashIterator(hashTable *pt , size_t r ,typename list<T>::iterator i ):
ptable(pt) , row(r) , it(i){}
{
for(int i=row+1;i<ptable->rows;i++)//从下一行开始扫描,直到第一个元素非空
{
if(!ptable->table[i].empty())
{
row=i;
it=ptable->table[i].begin(); //返回第一个元素
return;
}
}
row=-1; //返回end()
}
public:
hashIterator(){}
bool operator==(const hashIterator &rh)//等于操作符
{
if(row==-1&&rh.row==-1) // 定义row==-1为end()
return true;
else if(row==rh.row) //如果不是end(),则需比较迭代器
return it==rh.it;
else //定义不同行时不具有比较性
return false;
}
bool operator!=(const hashIterator &rh)//不等于操作符
{
return !operator==(rh);
}
hashIterator& operator++() //前置++
{
if(row==-1) //定义end()不可++
{
cerr<<"end(),can't ++"<<endl;
return *this;
}
it++;
if(it==ptable->table[row].end())
nextRow();
return *this;
}
hashIterator operator++(int) //后置++
{
hashIterator tem(*this);
++*this;
return tem;
}
T& operator*() //解引用操作符
{
if(row==-1)
cerr<<"can't derefference "<<endl;
else
return *it;
}
};
#endif
哈希表迭代器的测试详见