簡體   English   中英

問題C ++ STD Iterator比較運算符

[英]Problem C++ STD Iterator comparison operators

早上好先生

因為看起來我的情況不會那么好。

我有一個C類,它沒有任何子代,但有一個由指向另一個類的實例的指針組成的向量,我們稱它為B:

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

B還有一個指向另一個類的實例的指針向量,我們稱它為A:

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

C有一個遍歷element和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 ++)一直告訴我在(類層次結構)中沒有運算符!=的匹配項。

有人知道我做錯了嗎? 其他運算符(例如'<')似乎也不起作用。

我不是新手,但這是我第一次在C ++(以前的Python程序員)中使用迭代器,而且我無法真正弄清楚代碼的問題所在。

感謝您的事先幫助,我為此感到迷茫!

編輯:我正在添加整個錯誤以供參考。 我對其進行了編輯以適合該問題,希望我不要弄亂任何東西:

在'it1!'中沒有'operator!='的匹配!=(((C *)this)-> C :: elements.std :: vector <_Tp,_Alloc> :: end _Tp = B *,_Alloc = std ::分配器”

您應該嘗試這樣:

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
    }
}
  • 在內部循環中,您嘗試將it1 (類型為std::vector<B*>::iterator )與它it1->elements2.end() (類型為std::vector<A*>::iterator it1->elements2.end() std::vector<A*>::iterator )進行比較,所以編譯器是正確的抱怨。
  • 您必須取消引用迭代器it2以“到達”類型為A*的元素: (*it2)->do_something()

附帶說明一下,可能有幾種方法可以改善您現有的代碼,但我僅列舉幾種:

  • 我會避免使用this->
  • 使用typedef澄清涉及迭代器的代碼
  • 如果不在循環外使用it1it2 ,請縮小范圍

您可以編寫(顯然,向量typedef的名稱應該更有意義):

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)
    {
        /* ... */
    }
}

這應該編譯為:

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
    }
}

但是我不知道你想做什么。

您有一個指向指針的向量。 因此,要在該指針上調用函數,必須先解除對迭代器的引用(以獲取指針),然后再對其進行調用。

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上可以正常編譯

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();
            }
        }
    }
};

以下代碼適用於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;
};


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM