前缀运算符的实现



我的哈希表有 2D 向量

std::vector<std::vector<std::string> > htable;

和迭代器的类。

class myiterator{
    public:
        myiterator();
        myiterator(std::vector<std::vector<std::string> >& v, int ii, int jj) : 
            vec(v), i(ii), j(jj) {}
        myiterator& operator++(); // prefix operator
        myiterator& operator--(); // prefix operator
        std::string* operator->();
    private:
        std::vector<std::vector<std::string> >& vec; // the vector we are iterating over
        int i; // the position in the vector (first dimension)
        int j; // the position in the vector (second dimension)
    };
    myiterator begin() {
        int start=0;
        while(htable[start].size()==0){
            start++;
        }
        return (myiterator(htable, start, 0));
    }
    myiterator end(){
        int end=htable.size()-1;
        while(htable[end].size()==0){
            end--;
        }
        return (myiterator(htable, end, htable[end].size()-1));
    }

我已经为迭代器实现了开始和结束,但我不知道如何以及如何使用前缀运算符。另外,我无法谷歌什么运算符"->"是什么?那么,请您给我一些关于 2d 向量的实现前缀迭代器的小技巧或文章吗?提前谢谢。

operator->是一个取消引用运算符。 它允许您编写it->myFunc()(即,允许迭代器的行为类似于指针)。 通常,您将返回迭代器指向的类型。

前缀运算符(operator++operator-- )应分别将迭代器移动到下一个和上一个元素。

作为旁注,如果你重载operator->,你也应该重载operator*(),你可能还想重载修复后运算符myiterator operator--(int)myiterator operator++(int)

当你增加迭代器时,你基本上做了与 begin() 相同的事情。

if ( j == htable[i].size() - 1 )  // j is at the end of the inner vector
  // set j to zero
  // increment i until htable[i] is not the end of the outer vector and is not empty
else
  // increment j

另一方面,我建议使用 vector 的迭代器代替 i 和 j。 例如:

class MyIterator
{
  std::vector< std::vector< std::string > >::iterator i;
  std::vector< std::string >::iterator j;
  // ...
}
MyIterator begin()
{
  std::vector< std::vector< std::string > >::iterator o_iter = htable.begin();
  while ( o_iter != htable.end() && o_iter->empty() )
    ++o_iter;
  // assuming htable wasn't empty...
  return MyIterator( htable, o_iter, o_iter->begin() );
}

最新更新