所以我在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::next
或
std::advance
,两者在幕后执行相同操作.无论如何,此操作将为O(N).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。