为双向量创建自己的迭代器

时间:2013-11-10 10:40:55

标签: c++ vector iterator

我对c ++有点新意,所以问题可能没有任何意义,所以,提前抱歉。 所以,我有一类哈希表,我的哈希表是向量的向量,这意味着我使用了

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

我的任务是 - 使用++, - , - &gt;创建自己的迭代器。和*。我写了这个

    class hashTable
{
public: 
    hashTable(int size);
    ~hashTable();
    void add(std::string s);
    bool inHash(std::string s);
    void deletestr(std::string s);
    void printall();
    int maxcoll();

private:
    std::vector<std::vector<std::string> > htable;
    std::vector<std::vector<std::string> > newhtable;
    int hfunc(std::string s);
    void reallocate();
    int M;
    int teksize;
    int issame(std::string a, std::string b);

    class myiterator{
        myiterator();
        myiterator operator*();
        myiterator operator++();
        myiterator operator--();
        myiterator operator->();

    };
    myiterator begin() {return htable.begin()}
    myiterator end() {return htable.end()}

};

我想,我理解了这个是什么,但现在我想我错了,所以当我尝试编译时,行中有一个错误

myiterator begin() {return htable.begin()}
myiterator end() {return htable.end()}

/ Users / ratkke / Programms / c ++ / mipt / tasks /#5 / myhash.cpp:37:29:错误:无法从'iterator'(又名'__wrap_iter')转换为'hashTable :: myiterator'         myiterator begin(){return htable.begin()}                                    ^ ~~~~~~~~~~~~~ /Users/ratkke/Programms/c++/mipt/tasks/#5/myhash.cpp:29:8:注意:候选构造函数(隐式复制构造函数)不可行:没有来自'iterator'的已知转换(又名'__wrap_iter') 'const hashTable :: myiterator&amp;'第一个论点         class myiterator {

我不知道为什么。另外,你能告诉我关于向量迭代器的迭代器(或文章的链接)的实现,因为我无法理解我必须如何实现所有这些运算符。 先感谢您。

1 个答案:

答案 0 :(得分:0)

您需要实施myiterator。有很多方法可以做到这一点,但至少你必须向myiterator添加一些内容。例如

class myiterator{
public:
    myiterator();
    myiterator(std::vector<std::vector<std::string> >& v, int ii, int jj) : 
        vec(v), i(ii), j(jj) {}
    std::string operator*();
    myiterator& operator++(); // prefix operator
    myiterator operator++(int); // postfix operator
    myiterator& operator--(); // prefix operator
    myiterator operator--(int); // postfix 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() {return myiterator(htable, 0, 0);}

很多其他方法可以做到这一点,而上述内容可能并不完全符合您的要求,但希望这可以为您提供一个想法,myiterator必须有一些数据成员来保持向量的迭代和位置到目前为止。

另请注意,operator*的返回类型错误,应该(大概)为std::string。其他一些运营商看起来也不正确,我已经把我认为正确的代码放在了代码中。