C++数据结构--.哈希表独立表链地址法迭代器的设计

1.哈希表独立表链地址法中迭代器的设计
  *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){}


     void nextRow()// 返回哈希表下一行非空的第一个元素 
{
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




 哈希表迭代器的测试详见 

C++数据结构--.哈希表线性探测开放寻址法与独立表链地址法


  
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值