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

C++ C++;std::set无法使用运算符+;在迭代器上,因为编译错误,c++,compiler-construction,stl,iterator,stdset,C++,Compiler Construction,Stl,Iterator,Stdset,因此,我只在std::set上遇到了一个奇怪的迭代器错误:我无法在迭代器上做(it+1)这样简单的事情,而不会出现编译错误 试着自己编译这个: void setBug() { std::set<int> values; for (auto it = values.cbegin(); it != values.cend(); ++it) { if ((it + 1) != values.end()) value

因此,我只在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));
    }
}
void setBug()
{
std::设定值;
for(auto it=values.cbegin();
it!=values.cend();++it){
如果((it+1)!=values.end())
插入(*it/*(it+1));
}
}
错误:二进制表达式的操作数无效('std::_1::_tree\u const\u iterator*,long>'和'int') 如果((it+1)!=values.end())

错误:二进制表达式的操作数无效('std::_1::_tree\u const\u iterator*,long>'和'int') 插入(*it/*(it+1))

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

我找到了一个肮脏的解决方案:(autoit2=++it;--it)它可以工作,但这真的很肮脏

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


谢谢。

std::set
迭代器非常有用。这些不支持通过加法运算符递增。你需要一步一步地递增,或者使用or,这两种方法在幕后都是一样的。不管怎样,此操作都将是O(N)。

它是一个双向迭代器,而不是一个随机访问迭代器
auto it2=it++it2将比脏的解决方案更干净。