【问题标题】:Problem C++ STD Iterator comparison operators问题 C++ STD 迭代器比较运算符
【发布时间】:2011-05-13 19:24:43
【问题描述】:

先生们,你们好,

因为看起来我的不会那么好。

我有一个类 C,它没有任何子类,但有一个由指向另一个类的实例的指针组成的向量,我们称之为 B:

class C
{
    public:
       ...
       std::vector<B*> elements;
       ...
}

B 也有一个指向另一个类实例的指针向量,我们称它为 A:

class B
{
    public:
       ...
       std::vector<A*> elements2;
       ...
}

C有一个方法可以遍历elements和elements2的元素,工作方式如下:

std::vector<B*>::iterator it1;
std::vector<A*>::iterator it2;

for (it1=this->elements.begin(); it1!=this->elements.end(); ++it1)
{
    for (it2 = it1->elements2.begin(); it12=it1->elements2.end(); ++it2)
    {
        it2->do_something(); //method of class A
    }
}

但是编译器 (g++) 一直告诉我在(类层次结构)中没有 operator!= 的匹配项。

有人知道我做错了什么吗? '

我不是新手,但这是我第一次在 C++(前 Python 程序员)中使用迭代器,我真的不知道我的代码有什么问题。

提前感谢您的帮助,我为此失去了头发!

编辑:我正在添加整个错误以供参考。我对其进行了编辑以适应问题,希望我没有搞砸任何事情:

在 'it1 != ((C*)this)->C::elements.std::vector<_tp _alloc>::end with _Tp = B*, _Alloc = 中不匹配 'operator!=' std::allocator'

【问题讨论】:

    标签: c++ vector iterator std operator-keyword


    【解决方案1】:

    你应该试试这个:

    std::vector<B*>::iterator it1;
    std::vector<A*>::iterator it2;
    
    for (it1=this->elements.begin(); it1 != this->elements.end(); ++it1)
    {
        for (it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2)
        {
            (*it2)->do_something(); //method of class A
        }
    }
    
    • 在内部循环中,您尝试将it1std::vector&lt;B*&gt;::iterator 类型)与it1-&gt;elements2.end()std::vector&lt;A*&gt;::iterator 类型)进行比较,因此编译器抱怨是正确的。
    • 您必须取消对迭代器 it2 的引用才能“到达”A* 类型的元素:(*it2)-&gt;do_something()

    附带说明一下,可能有几种方法可以改进您现有的代码,但我只会说几个:

    • 我会避免使用this-&gt;
    • 使用typedef 澄清涉及迭代器的代码
    • 如果it1it2 未在循环外使用,则缩小其范围

    你可以写(显然,typedef'ed 的向量名称应该更有意义):

    typedef std::vector<A*> vector_of_A;
    typedef std::vector<B*> vector_of_B;
    for (vector_of_B::iterator it1 = elements.begin(), end1 = elements.end(); it1 != end1; ++it1)
    {
        vector_of_A &innerVector = (*it1)->elements2;
        for (vector_of_A::iterator it2 = innerVector.begin(), end2 = innerVector.end(); it2 != end2; ++it2)
        {
            /* ... */
        }
    }
    

    【讨论】:

    • 打错字了,对不起。 it1(内循环)当然应该是 it2。它仍然没有编译。编辑:实际上,在外部和内部循环上,我在内部循环之前都得到了编译器错误。
    • 为向量的末端创建迭代器显然关闭了运算符问题,尽管出现了其他一些问题(可能是我的错)。我想知道它的原因是什么。我将尝试修复其他一些错误。在那之前,这是最有效的答案。谢谢!编辑:完美运行。最佳答案!
    【解决方案2】:

    这应该编译:

    std::vector<B*>::iterator it1;
    std::vector<A*>::iterator it2;
    
    for (it1 = elements.begin(); it1 != elements.end(); ++it1)
    {
        for (it2 = elements2.begin(); it2 != elements2.end(); ++it2)
        {
            it2->do_something(); //method of class A
        }
    }
    

    但我不知道你真正想做什么。

    【讨论】:

      【解决方案3】:

      你有一个指向指针的向量。因此,要在该指针上调用函数,您必须首先取消引用迭代器(以获取指针),而不是在其上调用函数。

      for ( it1 = elements.begin(); it1 != elements.end(); ++it1)
      {
          for (it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2)
          {
              (*it2)->do_something(); //method of class A
          }
      }
      

      编辑:我认为问题出在其他地方。以下代码在 VS2008 和 VS2010 上编译良好​​p>

      class A
      {
      public:
          void Fn()
          {
          }
      };
      
      class B
      {
          public:
             std::vector<A*> elements2;
      };
      
      class C
      {
          public:
             std::vector<B*> elements;
      
          void Fn()
          {
              std::vector< B* >::iterator it1;
              std::vector< A* >::iterator it2;
      
              for ( it1 = elements.begin(); it1 != elements.end(); ++it1 )
              {
                  for ( it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2 )
                  {
                      (*it2)->Fn();
                  }
              }
          }
      };
      

      【讨论】:

      • 我想这解决了一个无法预料的问题,谢谢!但是,操作员问题仍然存在,因此即使您的回答有用且有效(并为我省了很多麻烦),问题仍然没有解决:(
      【解决方案4】:

      以下代码适用于 linux 上的 gcc 4.2.0。你用的是什么版本?
      可能是您声明类的顺序或其他问题。

      #include <vector>
      
      
      class A;
      class B;
      class C;
      
      class A {
        public:
          void do_something() {};
      };
      class B
      {
        public:
          std::vector<A*> elements2;
      };
      
      
      class C
      {
        public:
          std::vector<B*> elements;
      
          void do_this() {
            std::vector<B*>::iterator it1;
            std::vector<A*>::iterator it2;
      
            for (it1=this->elements.begin(); it1!=this->elements.end(); ++it1)
            {
              for (it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2)
              {
                (*it2)->do_something(); //method of class A
              }
            }
          };
      };
      
      int main() {
        C c;
      };
      

      ~
      ~

      【讨论】:

        猜你喜欢
        • 2021-01-14
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 2010-12-12
        • 1970-01-01
        • 2020-06-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多