2011-09-29 50 views
0

我试图找到列表中的一个对象的出现次数对象的出现次数:统计列表中的

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?显然,我不是一个迭代器(指针),而不是一个复杂的对象?

+1

'iterator'!='pointer'。指针是一种特殊类型的迭代器。 –

回答

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

我希望这会工作。

+0

这意味着Bjarne应该在他的TCPL(特别版)书中更改代码(第3.8.1节)? :) – badmaash

+0

为什么我+ 1工作的std ::字符串,而不是一个std ::列表? – badmaash

+0

列表有双向运算符,也没有随机访问迭代器。根据stl文档,双向迭代器没有'operator +(int)'操作符重载,但随机访问迭代器(像向量中那样)。 – NiematojakTomasz

0

这是一个没有随机访问操作的列表迭代器。你想做的事:

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

你可以简化代码很多的方式有两种:

使用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我会建议使用第一种方法。

+0

+1我会这样做。谢谢。 – badmaash