所以我只在std :: set上遇到了一个奇怪的迭代器错误:我无法在没有编译错误的情况下在迭代器上执行类似(it + 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')值.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
迭代器是双向迭代器。这些不支持通过加法运算符进行增量。您需要逐步增加,或使用std::next
或std::advance
,这两种操作在后台都相同。无论该操作为O(N)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句