为双向量创建自己的迭代器 我在C++上有点新,所以这个问题可能没有任何意义,所以,对此我很抱歉。 我有一类哈希表,我的哈希表是向量的向量,这意味着我使用了 std::vector<std::vector<std::string> > htable;

为双向量创建自己的迭代器 我在C++上有点新,所以这个问题可能没有任何意义,所以,对此我很抱歉。 我有一类哈希表,我的哈希表是向量的向量,这意味着我使用了 std::vector<std::vector<std::string> > htable;,c++,vector,iterator,C++,Vector,Iterator,/Users/ratkke/Programms/c++/mipt/tasks/#5/myhash.cpp:37:29:错误:从“迭代器”(也称为“包装器”)到“哈希表::myiterator”没有可行的转换 myiterator begin(){返回htable.begin()} ^~~~~~~~~~~~~~ /Users/ratkke/Programms/c++/mipt/tasks/#5/myhash.cpp:29:8:注意:候选构造函数(隐式副本构造函数)不可行:没有已知的从第一个参数的“

/Users/ratkke/Programms/c++/mipt/tasks/#5/myhash.cpp:37:29:错误:从“迭代器”(也称为“包装器”)到“哈希表::myiterator”没有可行的转换 myiterator begin(){返回htable.begin()} ^~~~~~~~~~~~~~ /Users/ratkke/Programms/c++/mipt/tasks/#5/myhash.cpp:29:8:注意:候选构造函数(隐式副本构造函数)不可行:没有已知的从第一个参数的“迭代器”(也称为“u wrap_iter”)到“const hashTable::myiterator&”的转换 类迭代器{

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

您需要实现您的
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{
公众:
myiterator();
myiterator(std::vector&v,int ii,int jj):
vec(v),i(ii),j(jj){}
std::字符串运算符*();
myiterator&operator++();//前缀运算符
myiterator运算符++(int);//后缀运算符
My迭代器和运算符--();//前缀运算符
myiterator运算符--(int);//后缀运算符
std::string*运算符->();
私人:
std::vector&vec;//我们正在迭代的向量
int i;//向量中的位置(第一维)
int j;//向量中的位置(第二维)
};
myiterator begin(){返回myiterator(htable,0,0);}
有很多其他的方法可以实现这一点,上面的方法可能并不完全是您想要的,但希望这能给您一个想法,
myiterator
必须有一些数据成员,这些成员包含被迭代的向量和到目前为止到达的位置


另请注意
运算符*
的返回类型是错误的,应该是(大概是)be
std::string
。其他一些操作符看起来也不正确,我已经在代码中添加了我认为正确的内容。

您需要实现您的
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{
公众:
myiterator();
myiterator(std::vector&v,int ii,int jj):
vec(v),i(ii),j(jj){}
std::字符串运算符*();
myiterator&operator++();//前缀运算符
myiterator运算符++(int);//后缀运算符
My迭代器和运算符--();//前缀运算符
myiterator运算符--(int);//后缀运算符
std::string*运算符->();
私人:
std::vector&vec;//我们正在迭代的向量
int i;//向量中的位置(第一维)
int j;//向量中的位置(第二维)
};
myiterator begin(){返回myiterator(htable,0,0);}
有很多其他的方法可以实现这一点,上面的方法可能并不完全是您想要的,但希望这能给您一个想法,
myiterator
必须有一些数据成员,这些成员包含被迭代的向量和到目前为止到达的位置


还要注意的是,
操作符*
的返回类型是错误的,它应该(大概)是
std::string
。其他一些操作符看起来也不正确,我已经在代码中输入了我认为正确的内容。

我不理解这个'my迭代器(std::vector&v,intii,intjj):vec(v),I(ii),j(jj){}行,你是怎么做的?为什么在一些迭代器中我们有指针?谢谢advance@ratkke,它只是一个构造myiterator对象的构造函数。如果您需要实现迭代器,迭代器就有指针。每个迭代器的实现方式都不同,如果您愿意,可以使用该迭代器的指针。-1:不够。你错过了迭代器所需的许多特性(可分配/可比较)。如果你想让迭代器与算法一起正确工作,你需要设置它们,以便迭代器特性正确工作。哈希通常不需要双向迭代器,所以减量运算符是不常见的(但支持比你需要的更多也没什么错)@LokiAstari这并不意味着足够,只是一个开始。试图向初学者解释编写迭代器的每一个细微差别对我来说都没有帮助。OP会在他进行过程中发现你提出的问题。如果你阅读他的一些后续问题,你会发现已经发生了这种情况。我不理解这一点向量(std::vector&v,intii,intjj):向量(v),i(ii),j(jj){}行,你是怎么做的?为什么在一些迭代器中我们有指针?谢谢advance@ratkke,它只是一个构造myiterator对象的构造函数。如果您需要实现迭代器,迭代器就有指针。每个迭代器的实现方式都不同,如果您愿意,可以使用该迭代器的指针。-1:不够。你错过了迭代器所需的许多特性(可分配/可比较)。如果你想让迭代器与算法一起正确工作,你需要设置它们,以便迭代器特性正确工作。哈希通常不需要双向迭代器,所以减量运算符是不常见的(但支持比你需要的更多也没什么错)@LokiAstari这并不意味着足够,只是一个开始。试图向初学者解释编写迭代器的每一个细微差别对我来说都是没有帮助的。OP会在他继续的过程中发现你提出的问题。如果你读了他的一些后续问题,你会发现这已经发生了。你需要回答的第一个问题是ask是它需要的迭代器类型。基本上有6个标准迭代器类
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);}