Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/47: Рейтинг темы: голосов - 47, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 5
1

C++: итераторы по умолчанию, пустые итераторы, end()

01.11.2017, 15:04. Показов 8433. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем добра!

Вопрос на тему итераторов в плюсах:
1.
какие значения имеют итераторы без инициализации
например,
C++
1
list<int>::iterator()
можно ли ими пользоваться?

2.
Существуют ли пустые итераторы? (что-то сравнимое
C++
1
с->empty()
)

3.
на сколько я понимаю, существует итератор с несуществующим значением
C++
1
2
list<int> x;
x->end();
этот end как раз и выдает это несуществующее значение.
Можно ли итератор инициализировать вручную этим значением?

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

Заранее благодарен.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2017, 15:04
Ответы с готовыми решениями:

Итераторы begin и end
Привет всем! Возникла проблема с итераторами. Пишу класс, который содержит вектор векторов. Пишу...

Реализовать итераторы begin() и end() для списка
Есть список. и операции для него 1)разыменование 2)инкремент (префиксный и постфиксный) 3) ==...

Итераторы и обратные итераторы
У вектора есть два типа итераторов, обычные и обратные итераторы произвольного доступа... Обычные...

Итераторы С++
Помогите, пожалуйста, надо написать две программы Задача 1 Напишите программу, использующую...

9
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
01.11.2017, 15:18 2
Цитата Сообщение от tm-green Посмотреть сообщение
можно ли ими пользоваться?
Например у std::istream_iterator итератор, созданный конструктором по умолчанию, считается концом ввода.
У всех свой смысл. Надо смотреть подробнее. У std::list<int>::iterator само по себе создание с параметром по умолчанию специального значения не имеет, да и использовать такой итератор не имеет смысла.
Цитата Сообщение от tm-green Посмотреть сообщение
Существуют ли пустые итераторы?
Что вы вкладываете в это понятие? Итераторы, которые не указывают никуда?
Возможно, вы хотите получить что-то, о чём я описал выше с std::istream_iterator?

Вы вообще вправе написать свои итераторы и использовать их. И помимо прочего дать им доп. функции и особое значение, когда он не инициализирован. Вопрос только зачем.

Цитата Сообщение от tm-green Посмотреть сообщение
на сколько я понимаю, существует итератор с несуществующим значением
См выше про std::istream_iterator

Добавлено через 48 секунд
Цитата Сообщение от tm-green Посмотреть сообщение
Можно ли итератор инициализировать вручную этим значением?
Только значением конкретного списка std::end(тип std::list<int>), либо тип std::list<int>.end()

Добавлено через 21 секунду
Цитата Сообщение от tm-green Посмотреть сообщение
Основная делема в том, чтобы хранить итераторы.
Обычно это не самая лучшая идея.

Добавлено через 53 секунды
Цитата Сообщение от tm-green Посмотреть сообщение
В разных случаях нужно проверять, ссылается ли хранимый экземпляр итератора на существующий элемент контейнера?
Слишком много вариантов когда все итераторы превращаются в тыкву (вставка/удаление элементов из контейнера). А если у вас контейнер константный, то не понятно зачем вообще итераторы хранить.

Добавлено через 51 секунду
Цитата Сообщение от tm-green Посмотреть сообщение
ссылается ли хранимый экземпляр итератора на существующий элемент контейнера
Это, кстати, больше походит на булев флаг. Возможно, вам стоит хранить и проверять его.
1
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 5
01.11.2017, 19:50  [ТС] 3
Спасибо, довольно развернуто.
У меня есть функция(в STL подобные кстати тоже есть), она возвращает итератор. Хочу обрабатывать там исключения, для этого необходимо оттуда возвращать пустой итератор(или типа того) и ловить её в месте вызова функции, чтобы потом можно было сравнивать его на пустоту. Как лучше это написать по вашему?
0
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
02.11.2017, 00:20 4
Цитата Сообщение от tm-green Посмотреть сообщение
Хочу обрабатывать там исключения, для этого необходимо оттуда возвращать пустой итератор(или типа того)
Так вы путаете исключение и код возврата. Если возбудить исключение, до возврата уже дело не дойдёт.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
02.11.2017, 01:26 5
Цитата Сообщение от tm-green Посмотреть сообщение
чтобы потом можно было сравнивать его на пустоту.
Гарантируется для всех ForwardIterator.
0
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 5
03.11.2017, 20:19  [ТС] 6
Искючения - отдельно. Мне нужно просто сравнить на Пустой итератор, делаю это так:
C++
1
return list<Note>::iterator();
Как правильно его сравнивать?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
04.11.2017, 03:23 7
Цитата Сообщение от tm-green Посмотреть сообщение
Как правильно его сравнивать?
Так и сравнивать - it==list<Note>::iterator(). Повторяю, корректность гарантируется для всех forward iterator. А у листа итераторы bidirectional, что включает в себя forward.
0
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 5
04.11.2017, 04:16  [ТС] 8
Renji,
Крайний вопросец, существует ли унифицированная форма пустого итератора? Можно ли сравнивать list::iterator() с map::iterator()? Спецификацию читать не хочется ради мелочи. Думаю если кто знает - всем будет полезно.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
04.11.2017, 05:47 9
Лучший ответ Сообщение было отмечено tm-green как решение

Решение

Цитата Сообщение от tm-green Посмотреть сообщение
Можно ли сравнивать list::iterator() с map::iterator()?
Нет, такого точно нельзя. Возможность сравнения гарантированна только для однотипных итераторов.
0
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 5
04.11.2017, 06:27  [ТС] 10
Всем спасибо! Тему можно закрывать.
0
04.11.2017, 06:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2017, 06:27
Помогаю со студенческими работами здесь

итераторы си++
подскажите пожалуйста какие существуют методы итераторов? и что они делают?

Итераторы
Добрый день! Начал изучать классы в C++ параллельно с итераторами. Решил сделать простенькую...

Итераторы в C++
Помогите плз решить 2 задачи Задача 1 Напишите программу, использующую итераторы при чтении...

Итераторы
Как указать не на следующий за последним элемент последовательности, а на последний! end() -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru