2011-09-29 62 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