В следующем коде я не могу распознать разницу между --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
постоянная BidrectionalIterator. Это означает, что он поддерживает ++it
а также --it
, Тем не менее, это не RandomAccessIterator (лайк std::vector::iterator
) — это то, что нужно было бы поддерживать it + n
а также it - n
,
В то время как --it
а также it -= 1
концептуально сделать то же самое, последний требует больше функциональности, чем std::set
обеспечивает. Вот почему это не поддерживается. Вы всегда можете использовать что-то вроде: std::prev(it, 1)
, который будет работать на любом итераторе, который удовлетворяет концепции BidirectionalIterator.
words.end()
дает итератор «элементу» после конца набора. Это не указывает ни на что, поэтому вы не можете разыменовать это.
Он служит в обязательном порядке для вашего набора. Вы можете, например, отсканировать ваш набор из words.end()
в words.begin()
:
for (set<string>::iterator it = words.begin() ; it != words.end() ; ++it)
{
cout << *it << endl;
}