微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C std :: set无法在迭代器上使用运算符,因为编译错误

所以我在std :: set上遇到了一个奇怪的迭代器bug:我无法在没有编译错误的迭代器上做一个简单的事情,比如(它1)
尝试自己编译:

void setBug()
{
    std::set<int> values;

    for (auto it = values.cbegin();
         it != values.cend(); ++it) {
        if ((it + 1) != values.end())
            values.insert(*it / *(it + 1));
    }
}

错误:二进制表达式的操作数无效(‘std :: _ 1 :: _ tree_const_iterator *,long>’和’int’)
if((it 1)!= values.end())

错误:二进制表达式的操作数无效(‘std :: _ 1 :: _ tree_const_iterator *,long>’和’int’)
values.insert(* it / *(it 1));

编译器版本:
Apple LLVM 5.0版(clang-500.2.79)(基于LLVM 3.3svn)
目标:x86_64-apple-darwin13.1.0
线程模型:posix

我找到了一个肮脏的解决方案:( auto it2 = it; –it)有效,但这真的很脏……

有人解释一下吗? std :: set坏了吗?

谢谢.

解决方法

std :: set迭代器是 bidirectional iterators.这些不支持通过加法运算符进行递增.您需要逐步递增,或使用 std::nextstd::advance,两者在幕后执行相同操作.无论如何,此操作将为O(N).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐