带有设置迭代器的 `it-1` 出错
Error on `it-1` with set iterator
在下面的代码中,我无法识别 --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;
}
那是因为 std::set::iterator
is a constant BidrectionalIterator. That means it supports ++it
and --it
. However, it is not a RandomAccessIterator(如 std::vector::iterator
)- 这是支持 it + n
和 it - n
.
所需要的
虽然 --it
和 it -= 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;
}
在下面的代码中,我无法识别 --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;
}
那是因为 std::set::iterator
is a constant BidrectionalIterator. That means it supports ++it
and --it
. However, it is not a RandomAccessIterator(如 std::vector::iterator
)- 这是支持 it + n
和 it - n
.
虽然 --it
和 it -= 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;
}