使用set iterator在`it-1`上出错

Bra*_*art 0 c++ iterator set

在下面的代码我无法识别--it和之间的区别it-1.同样是words.end()值超出设定范围?

#include <iostream>
#include<set>

using namespace std;

int main()
{
    set<string> words;
    words.insert("test");
    words.insert("crack");
    words.insert("zluffy");
    set<string>::iterator it=words.end();
    cout<<*(--it)<<endl;//just works fine 
    cout<<*(it-1)<<endl;//Error 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 6

那是因为std::set::iterator是一个恒定的BidrectionalIterator.这意味着它支持++it--it.然而,这是不是一个RandomAccessIterator的(像std::vector::iterator) -这是它需要是支持it + nit - n.

虽然--it并且在it -= 1声明上做同样的事情,后者需要比std::set提供更多的功能.这就是为什么它不受支持.你总是可以使用:std::prev(it, 1),这可以在任何满足BidirectionalIterator概念的迭代器上工作.