2010-11-22 5 views
2

Добрый день,Задача C++ STD Операторы сравнения итераторов

потому что похоже, что мой не будет так хорош.

У меня есть класс C, который не имеет никаких детей, но имеет вектор, выполненный из указателей на экземпляры другого класса, давайте назовем его B:

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

B также имеет вектор указателей на экземпляры другого класса, давайте назовем его A:

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

C имеет метод, который перебирает элементы элементов и 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 ++) продолжает сообщать мне, что для оператора! = In (иерархия классов) нет соответствия.

Кто-нибудь знает, что я сделал не так? Другие операторы вроде «<», похоже, тоже не работают.

Я не новичок, но я впервые использовал итераторы на C++ (бывший программист на Python), и я не могу понять, что не так с моим кодом.

Спасибо за помощь заранее, я теряю волосы за это!

Редактировать: Я добавляю всю ошибку для справки. Я отредактировал его, чтобы ответить на этот вопрос. Надеюсь, я ничего не испортил:

нет соответствия для 'operator! =' In 'it1! = ((C *) this) -> C :: elements .std :: вектор < _Tp, _Alloc> :: заканчиваются _Tp = B *, _Alloc = станд :: распределителем»

ответ

4

Вы должны попробовать это:

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), поэтому компилятор прав жаловаться.
  • Вы должны разыменования итератора it2 к «рядом» элемент типа A*: (*it2)->do_something()

На стороне записки, есть, вероятно, несколько способов улучшить существующий код, но я буду утверждать лишь некоторые из них:

  • Я хотел бы избежать использования this->
  • Используйте typedef уточнить ваш код с участием итераторы
  • I е it1 и it2 не используются за пределами цикла, сузить сферу их применения

Вы могли бы написать (очевидно, вектор 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) 
    { 
     /* ... */ 
    } 
} 
+0

Это была опечатка, я извиняюсь. it1 (внутренний цикл), конечно, должен был быть it2. Он все еще не компилируется. Edit: Я получаю ошибку компилятора перед внутренним циклом, как на внешнем, так и на внутреннем. – Percival

+0

@Percival: answer отредактирован – icecrime

+0

Создание итераторов для концов векторов, по-видимому, отключает проблемы оператора, хотя некоторые другие возникли (возможно, моя ошибка). Интересно, в чем причина этого. Я попытаюсь исправить некоторые другие ошибки. Пока это самый верный ответ. Благодаря! Редактировать: работает отлично. Лучший ответ! – Percival

1

Это должно составить:

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

Но я не знаю, что вы действительно хотите делать.

1

У вас есть вектор для указателя. Чтобы вызвать функцию на этом указателе, вы должны сначала разыменовать итератор (чтобы получить указатель), чем вызвать функцию на нем.

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

Edit: Я думаю, что проблема заключается в другом. Следующий код компилируется на 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(); 
      } 
     } 
    } 
}; 
+0

Я думаю, это решает непредвиденную проблему, спасибо! Тем не менее, проблема с оператором все еще остается, поэтому даже если ваш ответ полезен и действителен (и сэкономил много неприятностей), проблема все еще не решена :( – Percival

0

Следующий код работает с gcc 4.2.0 на linux. Какую версию ты используешь?
Возможно, это порядок, в котором вы объявляете классы или какую-то другую проблему.

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

~
~

 Смежные вопросы

  • Нет связанных вопросов^_^