подсчет количества вхождений объекта в список - PullRequest
0 голосов
/ 29 сентября 2011

Я пытаюсь найти количество вхождений объекта в список:

class Complex{
  double re, im; 
 public:
   Complex (double r, double i):re(r), im(i){}
   Complex (){re = im = 0;}

   friend bool    operator == (Complex, Complex); 
};

bool operator == (Complex  a,  Complex b){
 return a.re == b.re and a.im == b.im;
}

template <class ContainerType, class ElementType>
int const count (ContainerType const & container, ElementType const & element){
  int count = 0;
  typename ContainerType::const_iterator i = std::find (container.begin(), container.end(), element);

  while (i != container.end()){
   ++count;
   i = std::find (i + 1, container.end(), element);
  }
 return count;
}

int main(){
 std::list <Complex> lc;
 lc.push_front (Complex (1.2, 3.4));

 std::cout << count (std::string("abhi"), 'a') << '\n';
 std::cout << count (lc, Complex (1.2, 3.4)) << '\n';

 return 0;
}

Я получаю эту ошибку с g ++ 4.5:

templatizedcharOccurences.c++: In function ‘const int count(const ContainerType&, const ElementType&) [with ContainerType = std::list<Complex>, ElementType = Complex]’:
templatizedcharOccurences.c++:51:44:   instantiated from here
templatizedcharOccurences.c++:41:4: error: no match for ‘operator+’ in ‘i + 1’
templatizedcharOccurences.c++:22:9: note: candidate is: Complex operator+(Complex, Complex)

Почему он жалуется на i+1? Ясно, не я ли итератор (указатель), а не сложный объект?

Ответы [ 3 ]

3 голосов
/ 29 сентября 2011

Вы можете значительно упростить код одним из двух способов:

Используйте std::count или один из его вариантов для подсчета. Итак:

return std::count(container.begin(), container.end(), element);

Или просто используйте простой цикл for, как вы уже сделали, но итерируйте его от начала до конца и выполняйте подсчет самостоятельно, например так:

int count = 0;
for (ContainerType::const_iterator it = container.begin(); it != container.end(); ++it)
{
    if (*it == element) ++count;
}
return count;

Поскольку вы уже используете части STL, я бы предложил использовать первый метод.

1 голос
/ 29 сентября 2011

Кажется, что у Iterator нет перегруженного оператора + (int), попробуйте:

class Complex{
  double re, im; 
 public:
   Complex (double r, double i):re(r), im(i){}
   Complex (){re = im = 0;}

   friend bool    operator == (Complex, Complex); 
};

bool operator == (Complex  a,  Complex b){
 return a.re == b.re and a.im == b.im;
}

template <class ContainerType, class ElementType>
int const count (ContainerType const & container, ElementType const & element){
  int count = 0;
  typename ContainerType::const_iterator i = std::find (container.begin(), container.end(), element);

  while (i != container.end()){
   ++count;
   i = std::find (++i, container.end(), element);
  }
 return count;
}

int main(){
 std::list <Complex> lc;
 lc.push_front (Complex (1.2, 3.4));

 std::cout << count (std::string("abhi"), 'a') << '\n';
 std::cout << count (lc, Complex (1.2, 3.4)) << '\n';

 return 0;
}

Надеюсь, это сработает.

0 голосов
/ 29 сентября 2011

Это итератор списка, который не имеет операций произвольного доступа. Вы хотите сделать:

++i;
i = std::find (i, container.end(), element);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...