带有设置迭代器的 `it-1` 出错

Error on `it-1` with set iterator

在下面的代码中,我无法识别 --itit-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;
}

那是因为 std::set::iterator is a constant BidrectionalIterator. That means it supports ++it and --it. However, it is not a RandomAccessIterator(如 std::vector::iterator)- 这是支持 it + nit - n.

所需要的

虽然 --itit -= 1 理论上做同样的事情,但后者需要比 std::set 提供的更多的功能。这就是它不受支持的原因。你总是可以使用类似的东西:std::prev(it, 1),它适用于满足双向迭代器概念的任何迭代器。

words.end() 给出了一个指向集合末尾后的 "element" 的迭代器。它不指向任何东西,所以你不能取消引用它。 它为您的套装提供一定的服务。例如,您可以将您的集合从 words.end() 扫描到 words.begin() :

for (set<string>::iterator it = words.begin() ; it != words.end() ; ++it)
{
    cout << *it << endl;
}