【问题标题】:Iterating over templated list遍历模板列表
【发布时间】:2015-01-17 12:02:58
【问题描述】:

我遇到了关于在模板上声明迭代器的问题 列表。下面是代码。

#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(res, root); ^ 4_4.cpp:52:20:错误:成员引用基类型“节点 *”不是结构或联合 如果(迭代-> 对) ~~~~^ ~~~~~ 生成 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);

}

【问题讨论】:

  • 仔细看看这个声明:cout&lt;&lt;" "&lt;&lt;*iter-&gt;data;,这里的iter是什么?然后了解operator precedence
  • C++11 功能,如 auto 和基于范围的 for 循环可能会让您的生活更轻松,例如:for (auto node : res[depth]){ if (node-&gt;left) ...
  • 谢谢。。更正了所有的错误。。请找到修改后的代码和新的错误
  • 我不相信你已经纠正了所有个错误,否则你不会有错误,请参阅@JoachimPileborg 的评论。

标签: c++ list stl


【解决方案1】:

您的代码中有很多错误。

为了避免提到的错误,在迭代器之前添加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++)

在 main 中传递给 levelLinkedLists 的参数数量错误

levelLinkedLists(res, root);

应该是 3。

使用未定义的函数。

createMinimalBst(root, arr, 0, 8);

你已经定义了函数createMinBST,所以可能又是一个错字。

【讨论】:

  • 文档!您建议的解决方案已删除生成的错误,但没有解决目的,因为在删除所有错误后,我面临以下新错误:
  • 4_4.cpp:50:20: error: member reference base type 'Node *' is not a structure or union if(iter->left) ~~~~^ ~~~ ~ 4_4.cpp:83:8: 注意:在函数模板特化 'levelLinkedLists' 的实例化中要求 levelLinkedLists(res, root); ^ 4_4.cpp:52:20: 错误:成员引用基类型 'Node *' 不是结构或联合 if(iter->right) ~~~~^ ~~~~~ 2 个错误生成。
  • @Peter_pk 如果iterlist&lt;Node&lt;T&gt;*&gt; 的迭代器,那么你不能写iter-&gt;left。您需要取消引用迭代器以及包含的指针,因此请编写(*iter)-&gt;left。或者使用基于范围的 for 循环。
猜你喜欢
  • 2010-10-21
  • 2011-12-19
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 2017-12-25
  • 2019-09-29
  • 2020-04-04
  • 2011-01-25
相关资源
最近更新 更多