C++ 计算列表中对象的出现次数

C++ 计算列表中对象的出现次数,c++,list,compiler-errors,C++,List,Compiler Errors,我试图在列表中查找对象的出现次数: 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 ==

我试图在列表中查找对象的出现次数:

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;
}
类复合体{
双re,im;
公众:
复形(双r,双i):re(r),im(i){
复杂(){re=im=0;}
friend bool运算符==(复数,复数);
};
布尔运算符==(复数a、复数b){
返回a.re==b.re和a.im==b.im;
}
模板
int const count(ContainerType const&container,ElementType const&element){
整数计数=0;
typename ContainerType::const_迭代器i=std::find(container.begin(),container.end(),element);
while(i!=container.end()){
++计数;
i=std::find(i+1,container.end(),element);
}
返回计数;
}
int main(){
std::列表lc;
lc.push_front(综合体(1.2,3.4));

std::cout这是一个没有随机访问操作的列表迭代器。您要执行以下操作:

++i;
i = std::find (i, container.end(), element);

它是一个没有随机访问操作的列表迭代器。您要执行以下操作:

++i;
i = std::find (i, container.end(), element);

迭代器似乎没有重载运算符+(int),请尝试:

类复合体{
双re,im;
公众:
复形(双r,双i):re(r),im(i){
复杂(){re=im=0;}
friend bool运算符==(复数,复数);
};
布尔运算符==(复数a、复数b){
返回a.re==b.re和a.im==b.im;
}
模板
int const count(ContainerType const&container,ElementType const&element){
整数计数=0;
typename ContainerType::const_迭代器i=std::find(container.begin(),container.end(),element);
while(i!=container.end()){
++计数;
i=std::find(++i,container.end(),element);
}
返回计数;
}
int main(){
std::列表lc;
lc.push_front(综合体(1.2,3.4));

std::cout迭代器似乎没有重载运算符+(int),请尝试:

类复合体{
双re,im;
公众:
复形(双r,双i):re(r),im(i){
复杂(){re=im=0;}
friend bool运算符==(复数,复数);
};
布尔运算符==(复数a、复数b){
返回a.re==b.re和a.im==b.im;
}
模板
int const count(ContainerType const&container,ElementType const&element){
整数计数=0;
typename ContainerType::const_迭代器i=std::find(container.begin(),container.end(),element);
while(i!=container.end()){
++计数;
i=std::find(++i,container.end(),element);
}
返回计数;
}
int main(){
std::列表lc;
lc.push_front(综合体(1.2,3.4));

std::cout您可以通过以下两种方式之一简化代码:

使用
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的一部分,我建议您使用第一种方法。

您可以通过以下两种方法之一大大简化代码:

使用
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的一部分,我建议您使用第一种方法。

这意味着Bjarne应该在他的TCPL(特别版)书中更改代码(第3.8.1节):)列表有双向运算符,也没有随机访问迭代器。根据STL文档,双向迭代器没有
运算符+(int)
运算符重载,但随机访问迭代器重载(如向量)。@Abhi:因为字符串迭代器是随机访问迭代器。列表迭代器不是,它们是双向的。顺便说一下,TCPL中的代码很好。这意味着Bjarne应该在其TCPL(特别版)中更改代码(第3.8.1节)book?:)列表有双向运算符,也没有随机访问迭代器。根据stl文档,双向迭代器没有
运算符+(int)
运算符重载,但随机访问迭代器有(如vector)@Abhi:因为字符串迭代器是随机访问迭代器。列表迭代器不是,它们是双向的。顺便说一下,TCPL中的代码很好。
迭代器
!=
指针
。指针是一种特殊类型的迭代器。
迭代器
!=
指针
。指针是一种特殊类型的迭代器。