gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:15 26 4
gpt4 key购买 nike

我在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com