一直沒有總結過,每次設計都會出一些問題,要知道STL的報錯可不是那么容易看懂的。
假定需要設計的類為Country,各country之類比較的依據是人口population,分析如下:
情形一:如果類Country類是你本人設計的,即你擁有對Country類的修改權,那么在類中重載operator<就可以了,需要注意的就是必須將其設計為const成員函數,如下:
class Country
{
public:
explicit Country(int population)
{
m_nPopulation=population;
}
void print()
{
std::cout<<m_nPopulation<<std::endl;
}
//注:operator<必須是const成員函數
bool operator<(const Country& b)const
{
return m_nPopulation<b.m_nPopulation;
}
private:
int m_nPopulation;
};
int main(int argc, char* argv[])
{
Country countryArray[]={Country(43), Country(54),Country(85),Country(95),Country(12),Country(57),Country(124),Country(78),
Country(45), Country(56),Country(87),Country(457),Country(567),Country(123),Country(456),Country(237),
Country(43), Country(784),Country(728),Country(76),Country(467),Country(83),Country(723),Country(86)};
std::set<Country> countrySet;
int nSize=sizeof countryArray/ sizeof countryArray[0];
for (int i=0; i<nSize; ++i)
{
countrySet.insert(countryArray[i]);
}
for (std::set<Country>::iterator iter=countrySet.begin(); countrySet.end()!=iter; ++iter)
{
iter->print();
}
//Sleep(int(2e9));
system("pause");
return 0;
}
情形二:Country為不是你設計的,即類中沒有已存在的operator<比較器,同時你也無法對其進行修改,那么你現在需要做的是在外部設計一個比較器,確切的說,是一個函數對象(或函數,但函數無法內聯),如下:
class Country
{
public:
explicit Country(int population)
{
m_nPopulation=population;
}
void print()
{
std::cout<<m_nPopulation<<std::endl;
}
//比上一個設計需要新加入一個函數
int GetPopulation(void) const
{
return m_nPopulation;
}
private:
int m_nPopulation;
};
int main(int argc, char* argv[])
{
Country countryArray[]={Country(43), Country(54),Country(85),Country(95),Country(12),Country(57),Country(124),Country(78),
Country(45), Country(56),Country(87),Country(457),Country(567),Country(123),Country(456),Country(237),
Country(43), Country(784),Country(728),Country(76),Country(467),Country(83),Country(723),Country(86)};
//設計函數對象
struct country_less:public std::binary_function<Country, Country, bool>
{
//這個倒不必須成為const成員函數,呵呵
bool operator()(const Country& a, const Country& b)const
{
return a.GetPopulation()<b.GetPopulation();
}
};
//std::set的定義就要復雜一些了
std::set<Country, country_less> countrySet;
int nSize=sizeof countryArray/ sizeof countryArray[0];
for (int i=0; i<nSize; ++i)
{
countrySet.insert(countryArray[i]);
}
//同樣,迭代器的定義也要復雜一些
for (std::set<Country, country_less>::iterator iter=countrySet.begin(); countrySet.end()!=iter; ++iter)
{
iter->print();
}
//Sleep(int(2e9));
system("pause");
return 0;
}
這兩種情況的作用就是std::less<>謂詞,因此同樣適用于std::sort()