Если у меня есть итератор list<Tree_Node*>::iterator iter
, для определяемого пользователем класса Tree_Node
, как вернуть объект, который имеет Tree_Node*
точек, перейдя через итератор? Это в основном указатель на указатель, не так ли?Получение объекта, на который указывает двойной указатель
ответ
Вы разыменования итератора, чтобы добраться до Tree_Node*
объекта, затем разыменования, что, чтобы добраться до Tree_Node
:
**iter
Допустим, у вас есть член Tree_Node::x
, Вы можете обратиться к нему как:
(**iter).x
(*iter)->x
Это в основном указатель на указатель, не так ли?
В C++ абстракция итератора предназначена для того, чтобы иметь API, похожий на указатель ... на самом деле не имеет значения, как они реализованы, хотя для многих контейнеров это будет указатель.
В C++ 11, вы могли бы сделать:
for(auto node : tree)
cout << node->data;
Или в более старых версиях:
for(list<Tree_Node*>::iterator node = tree.begin(); node != tree.end(); node++)
cout << (*node)->data;
Это в основном указатель на указатель, это не?
Абстрагирование является наоборот: Указатель представляет собой особый тип итератора (и то, что предположительно итераторы были смоделированы после), в то время как итератор абстракция. Но вывод справедлив, так же, как с указателем на указатель вы можете сделать:
list<Tree_Node*>::iterator iter;
// assign something to iter
Tree_Node* ptr = *iter;
Tree_Node& node = *ptr;
или сокращенно:
Tree_Node& node = **iter;
Интересно. Можете ли вы дать мне пример итератора, который НЕ является указателем? В этом семестре почти ничего, кроме указателей, трудно представить другой метод косвенного доступа к объекту. – UnworthyToast
@UnworthyToast: Итератор, который мы используем здесь, уже такой пример. 'std :: list
Aha! Это меня всегда путало, но я думаю, что сейчас понял.Итак, вы говорите, что итераторы - это просто абстрактный тип данных, смоделированный после указателей, и на самом деле они часто являются указателями только с дополнительными перегруженными операторами. Но даже когда они сами не являются указателями, они обычно являются структурами, которые в определенной степени опираются на указатели, как в этом примере. У меня есть это право? – UnworthyToast
- 1. Получение адрес объекта, на который указывает ссылка
- 2. Как узнать тип объекта, на который указывает указатель на C++?
- 3. Изменение объекта, на который указывает указатель в C++
- 4. Удаление объекта, на который указывает указатель возвращаемой из другой функции
- 5. Указатель объекта случайным образом указывает на 0x00000
- 6. Вывод указателя на указатель пустоты, который указывает на другой указатель
- 7. индекс элемента, на который указывает указатель
- 8. Поиск размер массива, на который указывает указатель
- 9. Что указывает на указатель?
- 10. Значение указателя, на которое указывает двойной указатель, теряется (код c)
- 11. На что указывает указатель?
- 12. Как проверить, является ли двойной указатель, который указывает динамически выделенный одиночный указатель, равен NULL?
- 13. Получение размера массива, на который указывает IntPtr
- 14. Два объекта, который указывает на один
- 15. Получить указатель на объект указывает на
- 16. Двойной указатель, который указывает на самосозданную структуру - компилятор говорит «ОК» - прерывание программы
- 17. C++ - как написать тип, на который указывает указатель на функцию
- 18. Как изменить символ, на который указывает указатель на строку?
- 19. Назначение второго указателя на объект, на который указывает первый указатель
- 20. Создайте объект в памяти, на который указывает указатель на void
- 21. двойной указатель на структуры
- 22. Двойной указатель на функцию
- 23. C#: Указатель на двойной
- 24. Двойной указатель на символ []
- 25. Двойной указатель на функцию
- 26. Двойной указатель на 2D
- 27. Изменение где ++ указатель C указывает на
- 28. Получение ссылки объекта ошибка не указывает на экземпляр объекта
- 29. Указатель на вектор не указывает
- 30. Получение указателя на объект, на который указывает умный указатель - ошибка Ivalue
Для списка, что у меня есть, единственный раз, когда я добавить вещи к нему используя 'add()' функция. В функции я определяю Tree_Node *, чтобы добавить к ней, и у этого есть имя, но я делаю это только для того, чтобы избежать использования 'new' и беспокоиться о очистке. Вне функции это имя ничего не значит. Я планирую получить доступ к каждому элементу списка, используя цикл 'for'. Поскольку я не могу напрямую использовать формат (** iter) .x, который вы дали, должен ли я просто временно назначить каждому элементу указатель итератора (т. Е. «Tree_Node *») для переменной, чтобы у меня было имя для использования? Или есть лучший способ сделать это в цикле? – UnworthyToast
Вы можете сделать что-то вроде 'for (auto & p: my_list) p-> tree_node_operation();' - таким образом 'p' - это имя, присвоенное каждому последующему значению итератора для использования в цикле. –