前缀运算符的实现

时间:2013-11-10 19:17:08

标签: c++ iterator

我有哈希表的二维矢量

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));
    }

我已经为迭代器实现了开始和结束,但我不知道如何以及如何处理前缀运算符。另外,我不能谷歌什么运算符“ - &gt;”是什么? 那么,拜托,你能给我一个关于2d向量的实现前缀迭代器的小技巧或文章吗?提前谢谢。

2 个答案:

答案 0 :(得分:3)

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

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

作为旁注,如果您正在超载operator->,您还应该重载operator*(),并且您可能还想重置后修复操作符myiterator operator--(int)和{{ 1}}。

答案 1 :(得分: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

作为一方,我建议使用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() );
}