【问题标题】:Browse through a map out of template classes via Iterator通过迭代器浏览模板类的映射
【发布时间】:2012-06-28 02:50:45
【问题描述】:

我正在使用 c++,但我遇到的问题是,每次调用以下代码中的方法“getItem()”都会返回 0,尽管这不是写在地图中的整数,而且地图也不是空的。使用“typename...”语句作为类属性有什么问题吗?

    template <class t>
    class P {
    public:
        P(); 
        int getItem();

    private:
        std::map<int, P<t>* > m;
        typename std::map<int, P<t>* >::iterator it;
        bool visited;
    };

    template <class t>
    P<t>::P() {
      visited=false;
    }

    template <class t>
    int P<t>::getItem()
    {
        if(!visited) 
            it=m.begin();
        int i=it->first;
        it++;
        return i;
    }

方法“getItem()”仅在地图没有更多更改后调用。所以不应该有迭代器无效的原因。我通过调用 m[i]=p 将项目添加到地图中。

感谢您的帮助;)

【问题讨论】:

  • 仅此而已? visited 是否初始化为 false?如何向map 添加元素?您确定iterator 仍然有效吗?
  • 在P的构造函数中将visited设置为false。我通过为有效整数调用m[i]=p 将元素添加到地图中,这些整数永远不会是0 和有效的类对象p。在将所有元素添加到地图后,我调用该函数,因此在调用该方法时我不会更改它。还有其他原因导致迭代器不再有效吗?
  • 您好,欢迎来到 SO!在这样的谜团中,我们经常发现错误出在您发布的代码中,而不是您发布的代码中。 (毕竟,如果您知道错误在哪里,您就不会在这里,对吗?)请将您的原始程序缩减为显示错误的最小完整程序(通常是 20 行或所以)。然后将该整个程序复制粘贴到问题中。请参阅sscce.org 了解更多信息。
  • @Heusi 您从未将visited 设置为true,在每次调用getItem() 时,迭代器都设置为begin()。您可以在构造函数中初始化迭代器并完全摆脱visited

标签: c++ templates iterator


【解决方案1】:

您没有设置“已访问”布尔值,因此如果您运行一个生成“getItem”的循环,您总是会重新初始化迭代器“it”。

【讨论】:

  • 对不起,我没有提到它,但有一个构造函数,其中设置了visited。我将编辑我的帖子;)
  • 我认为布尔值的默认值为“false”。因此,即使您已经访问过数据结构,您也永远不会将其设置为 true。所以每次调用 getItem 都会返回第一个索引。但是,你确定你从来没有在某处写过 m[0] 吗?你能添加一些代码来显示这个类的使用吗?
【解决方案2】:

由于您在任何时候都没有将visited 设置为true,因此您总是返回map 中第一项的整数,大概是0。你的意思可能是这样的:

if(!visited)
{
    visited = true;
    it=m.begin();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多