2015-01-17 4 views
1

Я столкнулся с проблемой об объявлении итератора над шаблоном . Ниже приведен код.Iterating over templated list

#include<iostream> 
#include<vector> 
#include<list> 
using namespace std; 

template<typename T> 
struct Node 
{ 
    T data; 
    Node<T> *left,*right; 
}; 

template<typename T> 
Node<T>* newNode(T data) 
{ 
    Node<T>* root = new Node<T>(); 
    root->data = data; 
    root->left = NULL; 
    root->right = NULL; 
    return root; 
} 

template<typename T> 
void createMinBST(Node<T>*& root,T arr[],int start,int end) 
{ 
    if(start>end) 
     return; 
    int mid = (start+end)/2; 
    if (root == NULL) 
    { 
     root = newNode(arr[mid]); 
     createMinBST(root->left, arr,start , mid-1); 
     createMinBST(root->right, arr,mid+1 , end); 
    } 
} 

template<typename T> 
void levelLinkedLists(vector<list<Node<T>*> >& res,Node<T>* root) 
{ 
    list<Node<T>*>li; 
    li.push_back(root); 
    res.push_back(li); 
    int depth = 0; 
    while(!res[depth].empty()) 
    { 
     list<Node<T>*>l; 
     typename list<Node<T>*>::iterator iter; 
     for(iter = res[depth].begin();iter != res[depth].end(); iter++) 
     { 
      if(iter->left) 
       l.push_back(*iter->left); 
      if(iter->right) 
       l.push_back(*iter->right); 
     } 
     depth++; 
     res.push_back(l); 
    } 
} 

template<typename T> 
void printLevelLinkedLists(vector<list<Node<T>*> > res) 
{ 
    typename vector<list<Node<T>*> >::iterator iter; 
    for (iter = res.begin(); iter!= res.end();iter++) 
    { 
     list<Node<T>*>li = *iter; 
     typename list<Node<T>*>::iterator it; 
     for (it = li.begin(); it != li.end(); it++) 
     { 
      cout << (*it)->data <<" "; 
     } 
     cout<<endl; 
    } 
} 

int main() 
{ 
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 
    Node<int>* root; 
    root = NULL; 
    createMinBST(root, arr, 0, 8); 
    vector<list<Node<int>*> > res; 
    levelLinkedLists(res, root); 
    printLevelLinkedLists(res); 

} 

ошибка:

4_4.cpp:50:20: error: member reference base type 'Node<int> *' is not a structure or union 
     if(iter->left) 
      ~~~~^ ~~~~ 

4_4.cpp: 83: 8: Примечание: в конкретизации функции специализации шаблона 'levelLinkedLists' запрошенные здесь levelLinkedLists (разреш, корень); ^ 4_4.cpp: 52: 20: ошибка: ссылочный базовый тип элемента 'Узел *' не является структурой или соединением if (iter-> right) ~~~~^~~~~~ 2 возникших ошибки ,


Наконец получил правильный рабочий код .. спасибо всем за их быстрые входы

#include<iostream> 
#include<vector> 
#include<list> 
using namespace std; 

template<typename T> 
struct Node 
{ 
    T data; 
    Node<T> *left,*right; 
}; 

template<typename T> 
Node<T>* newNode(T data) 
{ 
    Node<T>* root = new Node<T>(); 
    root->data = data; 
    root->left = NULL; 
    root->right = NULL; 
    return root; 
} 

template<typename T> 
void createMinBST(Node<T>*& root,T arr[],int start,int end) 
{ 
    if(start>end) 
     return; 
    int mid = (start+end)/2; 
    if (root == NULL) 
    { 
     root = newNode(arr[mid]); 
     createMinBST(root->left, arr,start , mid-1); 
     createMinBST(root->right, arr,mid+1 , end); 
    } 
} 

template<typename T> 
void levelLinkedLists(vector<list<Node<T>*> >& res,Node<T>* root) 
    list<Node<T>*>li; 
    li.push_back(root); 
    res.push_back(li); 
    int depth = 0; 
    while(!res[depth].empty()) 
    { 
     list<Node<T>*>l; 
     typename list<Node<T>*>::iterator iter; 
     for(iter = res[depth].begin();iter != res[depth].end(); iter++) 
     { 
      if((*iter)->left) 
       l.push_back((*iter)->left); 
      if((*iter)->right) 
       l.push_back((*iter)->right); 
     } 
     depth++; 
     res.push_back(l); 
    } 
} 

template<typename T> 
void printLevelLinkedLists(vector<list<Node<T>*> > res) 
{ 
    typename vector<list<Node<T>*> >::iterator iter; 
    for (iter = res.begin(); iter!= res.end();iter++) 
    { 
     list<Node<T>*>li = *iter; 
     typename list<Node<T>*>::iterator it; 
     for (it = li.begin(); it != li.end(); it++) 
     { 
      cout << (*it)->data <<" "; 
     } 
     cout<<endl; 
    } 
} 

int main() 
{  int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 
    Node<int>* root; 
    root = NULL; 
    createMinBST(root, arr, 0, 8); 
    vector<list<Node<int>*> > res; 
    levelLinkedLists(res, root); 
    printLevelLinkedLists(res); 

} 
+3

[Не используйте 'using namespace std;' для себя!] (Http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice) –

+2

Look close at this statement: 'cout <<" "<<*iter-> data;', что здесь 'iter'? А затем узнайте о [приоритете оператора] (http://en.cppreference.com/w/cpp/language/operator_precedence). –

+1

Функции C++ 11, такие как 'auto' и ranged-based for loop, могут сделать вашу жизнь проще, например:' for (auto node: res [depth]) {if (node-> left) ... ' –

ответ

3

У вас есть довольно много ошибок в коде.

Чтобы избежать вышеупомянутой ошибки добавить typename перед тем итераторы

typename list<Node<T>*>::iterator it; 

Тогда у вас есть опечатки в одном из for петель

for (it = li.begin(); it != li.end();it+++) 
//should be: 
for (auto it = li.begin(); it != li.end();it++) 

неверное число параметров, переданных levelLinkedLists в основной

levelLinkedLists(res, root); 

должно быть 3.

Использование неопределенной функции.

createMinimalBst(root, arr, 0, 8); 

Вы определили функцию createMinBST, поэтому, вероятно, опечатка снова.

+0

doc! Решение, которое вы предложили, удалило возникшую ошибку, но не решило цель, так как после удаления всех ошибок я столкнулся с новыми ошибками, приведенными ниже: –

+0

4_4.cpp: 50: 20: ошибка: ссылочный базовый тип элемента «Узел *» не структуры или объединения если (iter-> слева) ~~~~^~~~~ 4_4.cpp: 83: 8: Примечание: в конкретизации функции специализации шаблона 'levelLinkedLists ' запрошенный здесь levelLinkedLists (резисторный , корень); ^ 4_4.cpp: 52: 20: ошибка: ссылочный базовый тип элемента 'Node *' не является структурой или соединением if (iter-> right) ~~~~^~~~~ 2 возникших ошибки. –

+2

@Peter_pk Если 'iter' является итератором' list *> ', тогда вы не можете написать' iter-> left'. Вам нужно разыменовать итератор, а также содержащий указатель, поэтому напишите '(* iter) -> left'. Или используйте цикл, основанный на диапазоне. –