Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Demion84
0 / 0 / 0
Регистрация: 13.02.2013
Сообщений: 9
#1

Вывод вектора указателей

22.08.2015, 16:31. Просмотров 900. Ответов 8
Метки нет (Все метки)

Всем доброго времени суток. Есть такая проблема, пытаюсь написать шаблонный класс для древовидной структуры:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <class T>
 
class Tree
{
      public:
             Tree();
             ~Tree();
             void print();          // функция вывода содержимого контейнера  
      
      protected:
                
                
                struct Node           
                {
                       T item;        
                       vector<Node*> next;    
                };
                
                vector<Node*> head;
 
};
с созданием дерева и помещением туда данных проблем нет.
проблема именно с выводом. Пытаюсь вывести данные используя итератор вектора:


C++
1
2
3
for (vector<Node*>::iterator iter = head.begin(); iter != head.end(); iter++)
     {
        cout << (*iter)-> item << endl; }
ругается:
59 C:\CPP\Employee\Tree.cpp expected `;' before "iter"
59 C:\CPP\Employee\Tree.cpp `iter' undeclared (first use this function)

Уже всю голову сломал. Подскажите, что может быть не так....
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2015, 16:31
Ответы с готовыми решениями:

Удаление указателей из вектора
Что то голова совсем не варит под вечер, подскажите, вот есть у меня вектор...

Создать копию вектора указателей
Есть вектор указателей на мой класс: vector &lt;TreeSet*&gt; tree_set_list; Каждый...

Сохранение в файл вектора указателей
Здравствуйте. Помогите, пожалуйста, советами - как правильно сохранить на диск...

Удаление из вектора указателей и предотвратить утечку памяти
Всем доброго времени суток!!! Помогите разобраться с удалением из вектора...

Запись вектора строк в массив указателей на тип char
Решаю задачу 4.34 из книги Липпмана С. Язык программирования С++. Вводный курс....

8
Ryder95
9 / 9 / 8
Регистрация: 24.10.2013
Сообщений: 216
22.08.2015, 16:34 #2
А iter - указатель?

Добавлено через 24 секунды
Если да, то тогда нужно убрать звёздочку перед iter
0
Evgenii Kushner
12 / 12 / 8
Регистрация: 12.08.2015
Сообщений: 55
22.08.2015, 16:59 #3
Это точно дерево а не стэк?
И наверное ошибка тут
C++
1
           cout << (*iter)-> item << endl; }
Мне как бы не понятно как это будет работать это какая-то смесь двух идентичных записей.
C++
1
2
          (*iter).item       // тоже самое что iter->item
           iter->item       // тоже самое что (*iter).item
0
Demion84
0 / 0 / 0
Регистрация: 13.02.2013
Сообщений: 9
22.08.2015, 17:11  [ТС] #4
В строчке
C++
1
 cout << (*iter)-> item << endl; }
как раз ошибки не выдаёт пока. ошибка именно в условии цикла. почему то не хочет определятся итератор. Может быть для шаблонных классов есть какие то нюансы в симантике.

а насчёт

(*iter)-> item

iter это указатель на вектор указателей типа Node. Разыменовываем iter и получаем указатель на объект класса. А далее уже добираемся до поля item.

Нашёл на простора интернета вот такой код:
C++
1
2
3
4
for(size_t i = 0; i < head.size(); i++)
   {
       cout << head[i]->item << endl;
   }
Он почему то без проблем всё выводит. А что у меня не так, так и не пойму....
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,306
Записей в блоге: 5
22.08.2015, 17:18 #5
Кажется так:
*Iter - достучались до указателя на Node
**Iiter- достучались до Node
то есть лучше бы:
(**Iter).Item
Попробуйте.
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.08.2015, 20:01 #6
Цитата Сообщение от Demion84 Посмотреть сообщение
А что у меня не так, так и не пойму....
Минимальный текст программы, которая даёт упомянутую ошибку увидеть можно?
По предоставленным отрывкам не совсем ясно в чем дело.
0
Demion84
0 / 0 / 0
Регистрация: 13.02.2013
Сообщений: 9
23.08.2015, 04:50  [ТС] #7
Программы пока как таковой нет. Есть желание именно разработать класс дерева.

Пока что написал вот что:

Заголовочный файл Tree.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# ifndef TREE
# define TREE
 
#include <vector>
# include <iterator>
 
using namespace std;
 
 
template <class T>
 
class Tree
{
      public:
             Tree();
             ~Tree();
 
             void push_node (const T& newNode);  // Запихиваем элемент
      
             void print();            //  Вывод на экран      
      
      protected:
                
                
                struct Node           // элемент контейнера
                {
                       T item;        // данные
                       vector<Node*> next;    // узел дерева
                };
                
                vector<Node*> head;           // поле класса
 
};
#endif
Файл Tree.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# include <iostream>
# include "Tree.h"
 
 
template <class T> void Tree<T>::push_node (const T& newNode)
{
     
     Node* newHead = new Node;
     newHead -> item = newNode;
     head.push_back(newHead);
          
}
template <class T> void Tree<T>::print()
{
       
      for (vector<Node*>::iterator iter = head.begin(); iter != head.end(); iter++)
     {
        cout << (*iter)->item << endl; }
 
}
Если это поможет, то вот ещё такая ошибка есть в строке определения итератора:
C:\CPP\Employee\Tree.cpp dependent-name ` std::vector<Tree<T>::Node*,std::allocator<Tree<T>::Node*> >::iterator' is parsed as a non-type, but instantiation yields a type
C:\CPP\Employee\Tree.cpp say `typename std::vector<Tree<T>::Node*,std::allocator<Tree<T>::Node*> >::iterator' if a type is meant
0
dimcoder
Полярный
467 / 440 / 157
Регистрация: 11.09.2011
Сообщений: 1,142
23.08.2015, 07:27 #8
Лучший ответ Сообщение было отмечено Demion84 как решение

Решение

Demion84,
C++
1
for (typename vector<Node*>::iterator iter = head.begin(); iter != head.end(); iter++)
прост с++ не уверен что iterator - это тип. А вдруг это всего лишь элемент класса vector<>? Нужно уточнять...
1
Demion84
0 / 0 / 0
Регистрация: 13.02.2013
Сообщений: 9
23.08.2015, 08:18  [ТС] #9
Спасибо! заработало! Всё гениальное просто
0
23.08.2015, 08:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2015, 08:18

Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char* ) элементам вектора строк
Напишите программу, присваивающую значения элементов списка указателей на...

Вывод контейнера указателей через потоковый итератор
Доброго дня всем. Собственно: std::list&lt;int*&gt; list; list.push_back(new...

Вывод массива на экран функцией с использованием указателей
Привет, при написании функции возникла проблема: в помеченной комментарием...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru