Ошибка на `it-1` с установленным итератором

В следующем коде я не могу распознать разницу между --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;
}

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.

6

Другие решения

words.end() дает итератор «элементу» после конца набора. Это не указывает ни на что, поэтому вы не можете разыменовать это.
Он служит в обязательном порядке для вашего набора. Вы можете, например, отсканировать ваш набор из words.end() в words.begin() :

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

По вопросам рекламы [email protected]