【发布时间】:2016-07-30 13:00:40
【问题描述】:
我是一所非常大公立学校的校长,十年来我一直看着我的孩子长大。他们每年的基本信息和考试成绩存储如下:
class KidInfo{
string name;
int age;
vector<int> score; //The lengths increases as my kids grows up
};
const int NUM = 100000; //Wow, that's gigantic my friend
KidInfo myKids[NUM];
现在我想分析这些结果并创建他们的学习资料。为此,我需要将数组myKids 按他们每年的考试成绩降序排列,十年。我必须使用std::sort 来保证效率,因为我经营着一所大型学校。
我不是一个非常熟练的 C++ 程序员,也不知道如何处理这个任务。查了sort multidimensional vector by 1st column的答案后,我写了如下代码:
bool cmpByYear1(const KidInfo &k1, const KidInfo &k2){
return k1.score[0] > k2.score[0];
}
bool cmpByYear2(const KidInfo &k1, const KidInfo &k2){
return k1.score[1] > k2.score[1];
}
//And 8 similiar functions
sort(muKids, myKids + NUM, cmpByYear1);
//print Year 1...
sort(muKids, myKids + NUM, cmpByYear2);
//print Year 2, and so on...
没过多久,我就厌倦了每年编写一个新的cmpByYearN 函数,所以我正在考虑更优雅的方法,例如模板:
template<int year>
bool cmpAnyYear(const KidInfo &k1, const KidInfo &k2){
return k1.score[year - 1] > k2.score[year - 1];
}
int main(){
//...
for(int year = 1; year <= 10; ++year){
sort(myKids, myKids + NUM, cmpAnyYear<year>);
}
//...
return 0;
}
不幸的是,我的代码出现了编译错误,其中包含如下消息
“template parameter "year": local variables cannot be used as non-type parameter...”.
所以我想改用 global 参数:
int globalYear = 1;
bool cmpAnyYear(const KidInfo &k1, const KidInfo &k2){
return k1.score[globalYear - 1] > k2.score[globalYear - 1];
}
int main(){
//...
for(; globalYear <= 10; ++globalYear){
sort(myKids, myKids + NUM, cmpAnyYear);
}
//...
return 0;
}
这一次我的代码实际上运行,但遗憾的是它仍然没有工作:看起来cmpAnyYear 函数已经修复 > 当我声明globalYear = 1; 并表现得就像cmpByYear1 一样,而不管globalYear 的后续变化。排序结果自第 2 年起保持不变。
【问题讨论】:
标签: c++ sorting templates multidimensional-array