【问题标题】:reverse iterator error : no match for 'operator!=' in 'rcit != std::vector<_Tp, _Alloc>::rend() with _Tp = int, _Alloc = std::allocator'反向迭代器错误:在 'rcit != std::vector<_Tp, _Alloc>::rend() with _Tp = int, _Alloc = std::allocator' 中不匹配 'operator!='
【发布时间】:2011-05-06 05:19:05
【问题描述】:

代码 A:

vector< int >::const_reverse_iterator rcit;
vector< int >::const_reverse_iterator tit=v.rend();
for(rcit = v.rbegin(); rcit != tit; ++rcit)
cout << *rcit << " ";

代码 B:

vector< int >::const_reverse_iterator rcit;
for(rcit = v.rbegin(); rcit != v.rend(); ++rcit)
cout << *rcit << " ";

CODE A 工作正常,但 CODE B为什么会报错:

DEV C++\vector_test.cpp 在 'rcit != std::vector<_tp _alloc>::rend() 中不匹配 'operator!=' with _Tp = int, _Alloc = std::allocator '

这是我正在尝试编写的程序。

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
using namespace std;
#include <vector>
using std::vector;
template< typename T > void printVector( const vector< T > &v);

template< typename T > 
void printVector( const vector< T > &v)
{
             typename vector< T >::const_iterator cit;
             for(cit = v.begin(); cit != v.end(); ++cit)
             cout << *cit << " ";
}

int main()
{
    int number;
    vector< int > v;

    cout << "Initial size of the vector : " << v.size()
         << " and capacity : " << v.capacity() << endl;
    for(int i=0; i < 3; i++)
    {
            cout << "Enter number : ";
            cin >> number;
            v.push_back(number);
    }
    cout << "Now size of the vector : " << v.size()
         << "and capacity : " << v.capacity() << endl;

    cout << "output vector using iterator notation " << endl; 
    printVector(v);

    cout << "Reverse of output ";
    vector< int >::const_reverse_iterator rcit;
    for(rcit = v.rbegin(); v.rend() != rcit ; ++rcit)
    cout << *rcit << " ";
    cin.ignore(numeric_limits< streamsize >::max(), '\n'); 
    cin.get();
return 0;
}

【问题讨论】:

  • 发布更多代码...您发布的代码不是问题...
  • 你的代码在 windows 上使用 mingw 编译得很好
  • 嗯,谢谢,@Vusak 这可能是我的 DevC++ 编译器...嗯
  • @munish 是的,我刚刚在使用 DevC++ 时遇到了同样的错误。感谢您在这里提出的问题,我很快就找到了解决方法!
  • 这可以通过 Android NDK 编译器修订版 9(可能还有更早的版本)重现

标签: c++ iterator


【解决方案1】:

问题是rend方法有两种形式:

reverse_iterator rend();
const_reverse_iterator rend() const;

在进行比较时,似乎使用了第一个(尽管我不知道为什么),并且未定义用于比较“const”和“non-const”迭代器的运算符!=。但是,当分配给变量时,编译器可以推断出要调用的正确函数,并且一切正常。

【讨论】:

  • P.S.你的程序在 Linux 上使用 gcc 编译时运行良好。
  • 谢谢,sje397,这更加确定了我的编译器 DevC++ 4.9.9.2 的问题。编译器我不太了解,网上弄的,开始用了,不知道哪个编译器适合学习和练习C++,能推荐一些吗?
  • 我建议在 Windows 上使用 Visual Studio 编译器(有一个免费的“快速”版本)和其他地方的 gcc - 我几乎没有接触过其他任何东西。
  • @sj397,您上面的解释似乎还可以,我猜是因为如果我只使用迭代器的非常量版本,它就可以编译,只有在使用 const_reverse_iterator 时才会出现问题。
【解决方案2】:

当我在 Xcode 4 或键盘中编译以下内容时,我没有收到任何错误或警告:

#include <iostream>
#include <vector>

int main () {
    using namespace std;
    vector< int > v;

    vector< int >::const_reverse_iterator rcit;
    for(rcit = v.rbegin(); rcit != v.rend(); ++rcit)
        cout << *rcit << " ";
}

您的程序与此有什么显着不同吗?你用的是什么编译器?奥格尼安的建议有用吗?如果将!= 替换为== 会怎样? (我知道这会导致运行时错误,但我很好奇编译器对此的反应。)

【讨论】:

  • 注意:您的完整程序列表也可以正常编译。
  • No @ognian 的建议不起作用。我只是复制了你的代码并粘贴并运行。给出了同样的错误,也许是我的 DevC++ 编译器版本 4.9.9.2。我没有尝试 ==。 @Vusak 还编译了我的代码,很好
  • 谢谢,是的,上面和下面的几乎所有人都这样做了。它的编译器。我需要在别处测试它
  • 看起来 DevC++ 使用了 MinGW。我很惊讶你会遇到这个问题。对于替代方案,使用 C++ 的一种快速且轻松的方式是使用像 codepad 这样的在线环境。在 Windows 上,Visual Studio Express 2010 是我强烈推荐的 IDE。
【解决方案3】:

尝试像这样交换 != 的操作数:

for(rcit = v.rbegin(); v.rend() != rcit; ++rcit)

【讨论】:

  • @Nawaz:在一些糟糕的 STL 实现上它确实如此
猜你喜欢
  • 1970-01-01
  • 2019-11-11
  • 2020-07-01
  • 2017-07-15
  • 2012-06-18
  • 2020-11-29
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多