c++ - gcc reverse_iterator 比较运算符丢失了吗?

标签 c++ gcc stl iterator

我在使用 gcc 的非 const 容器上使用 const 反向迭代器时遇到问题。好吧,只有某些版本的 gcc。

#include <vector>
#include <iostream>

using namespace std;

int main() {
    const char v0[4] = "abc";
    vector<char> v(v0, v0 + 3);

    // This block works fine
    vector<char>::const_iterator i;
    for (i = v.begin(); i != v.end(); ++i)
        cout << *i;
    cout << endl;

    // This block generates compile error with gcc 3.4.4 and gcc 4.0.1
    vector<char>::const_reverse_iterator r;
    for (r = v.rbegin(); r != v.rend(); ++r)
        cout << *r;
    cout << endl;

    return 0;
}

此程序编译正常,可在 gcc 4.2.1 (Mac Leopard)、Visual Studio 8 和 9 (Windows) 以及 gcc 4.1.2 (Linux) 上运行。

但是,gcc 3.4.4 (cygwin) 和 gcc 4.0.1 (Mac Snow Leopard) 存在编译错误。

test.cpp:18: error: no match for 'operator!=' in 'r != std::vector<_Tp, _Alloc>::rend() [with _Tp = char, _Alloc = std::allocator<char>]()'

这是 gcc 早期版本的错误吗?

由于 Mac 上 gcc 4.2.1 的其他问题,我们需要在 Mac 上使用 gcc 4.0.1,所以简单地使用较新的编译器对我来说并不是一个完美的解决方案。所以我想我需要改变我使用反向迭代器的方式。有什么建议吗?

最佳答案

这是现行标准的缺陷:http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#280

编辑:详细说明: 问题是,在当前标准中:

  • vector::reverse_iterator指定为 std::reverse_iterator<vector::iterator> , 和 vector::const_reverse_iterator作为std::reverse_iterator<vector::const_iterator> .
  • std::reverse_iterator 上的关系运算符使用单个模板参数定义,使得 reverse_iterator<iterator>reverse_iterator<const_iterator>不可比较。

在您的代码中,您比较了 const_reverse_iterator结果是在非常量 vector 上调用“rend()”,这是一个(非常量)reverse_iterator .

在 C++0x 中,进行了两项相关更改以解决如下问题:

  • reverse_iterator 上的关系运算符现在采用两个模板参数
  • 像 vector 这样的容器有额外的方法来明确请求一个 const_iterator:cbegin()、cend()、crbegin() 和 crend()。

在您的情况下,解决方法是明确请求 const_reverse_iterator 用于 rend():

vector<char>::const_reverse_iterator r;
const vector<char>::const_reverse_iterator crend = v.rend();
for (r = v.rbegin(); r != crend; ++r)
    cout << *r;

关于c++ - gcc reverse_iterator 比较运算符丢失了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2135094/

相关文章:

c++ - 如何使用 vector 的 vector 来读取图形?

c++ - C++98 中的容器初始化

c++ - 为什么这个 C++ STL 分配器不分配?

c++ - Bit hack 根据第二个值返回两个值之一

command-line - gcc 和 g++ 命令提示符编译和链接

c++ - int64 C++ debian6

c - gcc编译错误: cast specifies array type

c++ - 使用 Libcurl 将非常大的字符串发送到使用 REST API 的服务器?

具有模板类默认参数的 C++17 别名模板

c++ - SSE 复制、AVX 复制和 std::copy 性能