C++按照成员变量排序实例 (附C++代码)

思路

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;
    }
    
}

主函数

1319行将自定义的排序规则函数名传入。

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值