思路
在C++
标准库中,排序函数sort
接受一个返回值为bool
的函数作为第三参数,来对以第一和第二参数确定的序列,按照第三参数的要求排序。
这里将简要探讨
- 上述第三参数的编写形式
- 需要注意的一个地方,即类中变量不可声明为
const
。
效果
——————排序前——————
大小 : 7 重量 : 49
大小 : 23 重量 : 8
大小 : 30 重量 : 22
大小 : 44 重量 : 28
大小 : 23 重量 : 9
——————按照size排序后——————
大小 : 7 重量 : 49
大小 : 23 重量 : 8
大小 : 23 重量 : 9
大小 : 30 重量 : 22
大小 : 44 重量 : 28
——————按照weight排序后——————
大小 : 23 重量 : 8
大小 : 23 重量 : 9
大小 : 30 重量 : 22
大小 : 44 重量 : 28
大小 : 7 重量 : 49
代码以及注意事项
定义一个石头类
注意:若要针对实例中的某一元素来排序,则该类中的成员变量不可以声明为
const
类型,原因是sort
函数在底层会调用一个swap
即交换函数,如果类中的变量以const
类型声明,则底层调用失败
class stone {
public:
int size;
int weight;
// 析构函数
virtual ~stone() {}
// 构造函数
explicit stone(const float & size, const float & weight)
:size(size), weight(weight) {}
};
按照石头的大小、重量排序的传入函数
注意请严格按照这种形式编写
// 按照size排序
bool cmpWithSize(const stone & stoneA, const stone & stoneB) {
return stoneA.size < stoneB.size;
}
// 按照weight排序
bool cmpWithWeight(const stone & stoneA, const stone & stoneB) {
return stoneA.weight < stoneB.weight;
}
石头工厂
随机生成
numOfstone
个石头,存入vector
。
vector<stone> stoneFactory(const int numOfStone) {
// 创建vector存放stone
vector<stone> v;
// 将随机的stone加入vector中
for (int i = 0; i < numOfStone; ++i) {
// 随机生成大小与重量
const int size = rand() % 50;
const int weight = rand() % 50;
// 添加stone
v.push_back(stone(size, weight));
}
return v;
}
打印输出所有石头的信息
// 从前到后打印vector中的stone
void showStoneInVector(vector<stone> & v) {
for (int i = 0; i < v.size(); ++i) {
cout << "大小 : " << v[i].size << " " << "重量 : " << v[i].weight << endl;
}
}
主函数
第
13
与19
行将自定义的排序规则函数名传入。
int main() {
// 创建若干个随机stone,放入vector,并copy出另一份
const int num = 5;
vector<stone> v = stoneFactory(num);
// 打印原始stone序列
cout << "——————排序前——————" << endl;
showStoneInVector(v);
cout << endl << endl;
// 按照size排序
cout << "——————按照size排序后——————" << endl;
sort(v.begin(), v.end(), cmpWithSize);
showStoneInVector(v);
// 按照weight排序
cout << endl << endl;
cout << "——————按照weight排序后——————" << endl;
sort(v.begin(), v.end(), cmpWithWeight);
showStoneInVector(v);
}