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中的代码很好。迭代器
!=指针
。指针是一种特殊类型的迭代器。迭代器
!=指针
。指针是一种特殊类型的迭代器。