Является ли begin () допустимой операцией итератора, и если да, то на что она ссылается? - PullRequest
1 голос
/ 20 апреля 2020

Определены ли итераторы begin () и end () как функции-члены? Я думал, что для контейнеров были определены начало () и конец (), а итераторы имели ограниченное количество доступных операций, таких как сравнение, приращение и разыменование. В приведенном ниже примере кода кажется, что он использует begin () и end () на итераторах, и я не уверен, как это будет работать. Это ошибка или я что-то упустил?

Изображения ниже взяты из работы Бьярна Страуструпа "Программирование: принципы и практики", стр. 737 и 738 из главы 20. Единственными важными частями являются определения ln и pos в классе Text_iterator и использование ( * п) .end (). Я пометил (* ln) .end () 2. Для контекста он определяет итератор для класса Document, который представляет собой текстовое представление в памяти.

enter image description here enter image description here

Спасибо.

Смежный вопрос, кто-нибудь знает, как связаться с Бьярне? Я хочу задать ему этот вопрос, но я не знаю его электронной почты. Из его FAQ кажется, что он приветствует электронные письма, но это нигде не говорится.

1 Ответ

3 голосов
/ 20 апреля 2020

Нет. Типичный итератор не имеет метода begin или end. begin и end не вызываются на итераторе, они вызываются на объекте, на который ссылается итератор. *ln разыменовывает итератор и предоставляет объект, на который ссылается итератор, a Line в этом случае. (*ln).end() означает «Получите мне объект Line на ln и вызовите для него метод end». Что бы Line ни было, должно иметь begin и end методы, иначе компилятор поймает ошибку.

Проходя по логике c, мы получим

++pos; // advance iterator one character in the current Line
if (pos==(*ln).end()) { // if this character is the the `Line`'s end iterator
                        // we need a new line
{
    ++ln; // advance to the next line
    pos = (*ln).begin(); // referenced character is first character in next line
}
return *this; 

Это позволяет пользователь может перебирать документ по буквам, не осознавая, что они фактически пересекают строки, что позволяет писателю использовать уже существующий код для прохождения строк в документе и символов в строке. Практически никакой новый код не написан для того, что в противном случае могло бы быть сложной задачей.

...