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);