我有哈希表的二维矢量
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向量的实现前缀迭代器的小技巧或文章吗?提前谢谢。
答案 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() );
}