统计列表中的
我试图找到列表中的一个对象的出现次数对象的出现次数:统计列表中的
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
?显然,我不是一个迭代器(指针),而不是一个复杂的对象?
看来迭代器不具有重载运算符+(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;
}
我希望这会工作。
这意味着Bjarne应该在他的TCPL(特别版)书中更改代码(第3.8.1节)? :) – badmaash
为什么我+ 1工作的std ::字符串,而不是一个std ::列表? – badmaash
列表有双向运算符,也没有随机访问迭代器。根据stl文档,双向迭代器没有'operator +(int)'操作符重载,但随机访问迭代器(像向量中那样)。 – NiematojakTomasz
这是一个没有随机访问操作的列表迭代器。你想做的事:
++i;
i = std::find (i, container.end(), element);
你可以简化代码很多的方式有两种:
使用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我会这样做。谢谢。 – badmaash
'iterator'!='pointer'。指针是一种特殊类型的迭代器。 –