加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:25:52 所属栏目:百科 来源:网络整理
导读:所以我在std :: set上遇到了一个奇怪的迭代器bug:我无法在没有编译错误的迭代器上做一个简单的事情,比如(它1) 尝试自己编译: void setBug(){ std::setint values; for (auto it = values.cbegin(); it != values.cend(); ++it) { if ((it + 1) != values.e
所以我在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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读