C++ 反向迭代器赢得';不编译
我正试图编译一个反向迭代器,但我这样做的尝试带来了可怕的混乱。代码的最小示例是C++ 反向迭代器赢得';不编译,c++,C++,我正试图编译一个反向迭代器,但我这样做的尝试带来了可怕的混乱。代码的最小示例是 #include <iostream> #include <vector> #include <algorithm> class frag { public: void print (void) const; private: std::vector<int> a; }; void frag::print (void)
#include <iostream>
#include <vector>
#include <algorithm>
class frag {
public:
void print (void) const;
private:
std::vector<int> a;
};
void frag::print (void) const
{
for (std::vector<int>::reverse_iterator iter = a.begin ();
iter != a.end ();
++iter) {
std::cout << *iter << std::endl;
}
}
#包括
#包括
#包括
类碎片{
公众:
作废打印(作废)常数;
私人:
std::载体a;
};
作废框架::打印(作废)常数
{
对于(std::vector::reverse_迭代器iter=a.begin();
iter!=a.end();
++国际热核聚变实验堆(iter){
std::cout您需要使用const\u reverse\u迭代器(print
是const
函数,因此a
是const
)和a.rbegin()
和a.rend()
而不是begin()
和end())
您必须将反向迭代器分配给反向迭代器。与比较相同。可以使用方法rbegin
和rend
获得反向迭代器:
for (std::vector<int>::reverse_iterator iter = a.rbegin(); iter != a.rend(); ++iter);
for(std::vector::reverse_迭代器iter=a.rbegin();iter!=a.rend();++iter);
编辑(为了完整性)
正如其他人所注意到的,const_reverse_iterator在这里也是必要的。有两件事可能会导致代码中出现问题:
您的print()
函数声明为const
,因此您(可能需要或应该)使用const\u reverse\u迭代器
您正在从普通迭代器创建反向迭代器(std::vector::begin()
)
上述答案已经指出,在这种情况下,需要一个带有rbegin
/rend
的const\u reverse\u迭代器
除此之外,一个好的做法是使用crbegin
或crend
(在C++11中引入)明确指示您正在请求迭代器的常量版本,因为print
函数是const。dang,提前几分钟:(@rubenvb:虽然我的第一次尝试只发现了一个问题,但疯狂地编辑以更新第二个问题。:D一些问题似乎吸引了很多人,不是吗?谢谢。我在我的真实程序中尝试过,这已经解决了。+1-你太快了!我想我需要编写一个机器人或其他东西来检测新问题并允许我输入答案更快。这个网站就像魔兽世界,声誉点就像经验点一样,只是更有趣,毫无意义。在第二点中,问题不是指向最后一个元素,而是分配和比较不兼容的类型normal\u iterator
和reverse\u iterator
谢谢;我在r中没有犯这个错误eal程序,但我在这个最小的例子中尝试了很多东西。
for (std::vector<int>::reverse_iterator iter = a.rbegin(); iter != a.rend(); ++iter);