0

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

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

我的任务是 - 使用操作 ++、--、-> 和 * 创建自己的迭代器。我写了这个

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

};

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

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

/Users/ratkke/Programms/c++/mipt/tasks/#5/myhash.cpp:37:29:错误:没有从“迭代器”(又名“__wrap_iter”)到“hashTable::myiterator”的可行转换 myiterator begin() {return htable.begin()} ^~~~~~~~~~~~~~ /Users/ratkke/Programms/c++/mipt/tasks/#5/myhash.cpp:29:8: 注意:候选构造函数(隐式复制构造函数)不可行:对于第一个参数类 myiterator{

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

4

1 回答 1

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. 其他一些运算符看起来也不正确,我已将我认为正确的内容放入代码中。

于 2013-11-10T10:44:56.293 回答