一直沒有總結(jié)過,每次設(shè)計都會出一些問題,要知道STL的報錯可不是那么容易看懂的。
假定需要設(shè)計的類為Country,各country之類比較的依據(jù)是人口population,分析如下:
情形一:如果類Country類是你本人設(shè)計的,即你擁有對Country類的修改權(quán),那么在類中重載operator<就可以了,需要注意的就是必須將其設(shè)計為const成員函數(shù),如下:
class Country
{
public:
explicit Country(int population)
{
m_nPopulation=population;
}
void print()
{
std::cout<<m_nPopulation<<std::endl;
}
//注:operator<必須是const成員函數(shù)
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為不是你設(shè)計的,即類中沒有已存在的operator<比較器,同時你也無法對其進行修改,那么你現(xiàn)在需要做的是在外部設(shè)計一個比較器,確切的說,是一個函數(shù)對象(或函數(shù),但函數(shù)無法內(nèi)聯(lián)),如下:
class Country
{
public:
explicit Country(int population)
{
m_nPopulation=population;
}
void print()
{
std::cout<<m_nPopulation<<std::endl;
}
//比上一個設(shè)計需要新加入一個函數(shù)
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)};
//設(shè)計函數(shù)對象
struct country_less:public std::binary_function<Country, Country, bool>
{
//這個倒不必須成為const成員函數(shù),呵呵
bool operator()(const Country& a, const Country& b)const
{
return a.GetPopulation()<b.GetPopulation();
}
};
//std::set的定義就要復(fù)雜一些了
std::set<Country, country_less> countrySet;
int nSize=sizeof countryArray/ sizeof countryArray[0];
for (int i=0; i<nSize; ++i)
{
countrySet.insert(countryArray[i]);
}
//同樣,迭代器的定義也要復(fù)雜一些
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()