0

我的哈希表有 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));
    }

我已经为迭代器实现了开始和结束,但我不知道如何以及如何处理前缀运算符。另外,我无法用谷歌搜索运算符“->”是什么?所以,拜托,你能给我一些关于二维向量实现前缀迭代器的小技巧或文章吗?提前致谢。

4

2 回答 2

3

operator->是一个解引用运算符。它允许你写it->myFunc()(也就是说,允许迭代器表现得像一个指针)。通常,您将返回迭代器指向的类型。

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

附带说明一下,如果要重载operator->,则还应该重载operator*(),并且您可能还想重载后缀运算符myiterator operator--(int), 和myiterator operator++(int)

于 2013-11-10T19:26:08.773 回答
1

当你增加你的迭代器时,你基本上做的事情和你对 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

作为一个方面,我建议使用向量的迭代器来代替 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() );
}
于 2013-11-10T19:35:09.087 回答