对多个数据成员进行排序[重复]

Posted

技术标签:

【中文标题】对多个数据成员进行排序[重复]【英文标题】:Sorting multiple data members [duplicate] 【发布时间】:2019-06-12 18:28:39 【问题描述】:

在指针向量 (std::vector<SomeObject*) 中进行多重排序的最佳方法应该是什么?我应该为多个数据成员创建一个排序功能吗?最好的方法是什么?或者也许我应该为每个数据成员创建单独的函数?或者我应该使用std::sort() 的一些东西? 假设我有一些带有一些数据成员的类 Vehicle

    class Vehicle
    private:
        unsigned int _maxSpeed;
        unsigned short _numberOfHorsePower;
        unsigned short _numberOfGears;
        unsigned short _numberOfWheels;
        unsigned int _weight;
    

我希望可以选择按每个数据成员对这些对象进行排序,例如 SortByMaxSpeedAsc(),SortByWeightAsc(),SortByWeightDesc()

一个数据成员的示例排序

    void Vehicles::sortVehiclesByWeightAsc()
    
        Vehicle* tmp;
        size_t n = _VehiclesCollection.size();
        int i, j, minIndex;
    
        for (i = 0; i < n - 1; i++) 
        
            minIndex = i;
            for (j = i + 1; j < n; j++) 
            
                if (_VehiclesCollection[j].weight < _VehiclesCollection[minIndex].weight)
                
                    minIndex = j;
                
            
    
            if (minIndex != i) 
            
                tmp = _VehiclesCollection[i];
                _VehiclesCollection[i] = _VehicleCollection[minIndex];
                _VehiclesCollection[minIndex] = tmp;
            
    
        
    

【问题讨论】:

std::sort 与自定义比较器一起使用。 您可以进行预测:coliru.stacked-crooked.com/a/1e4aa7971dd9fc2d 似乎 ts 询问多个排序,即按标准 1 单独排序的数组。并同时按标准 2 对同一数组进行排序。即独立。并且可能的重复说明了单一排序:按标准 1 和在标准 1 的相同值内也按标准 2 排序。 【参考方案1】:

使用std::sort 并为每个案例编写一个Compare 函子。如果需要合并多个字段,请使用std::tie。

这是一个例子。您不需要像我在这里所做的那样对static 成员进行排序,但它可以将std::tie 与私有成员一起使用。

#include <algorithm>
#include <iostream>
#include <vector>

class Vehicle 
public:
    Vehicle(unsigned maxSpeed, unsigned short numberOfHorsePower,
            unsigned short numberOfGears, unsigned short numberOfWheels,
            unsigned weight) :
        maxSpeed_(maxSpeed),
        numberOfHorsePower_(numberOfHorsePower), numberOfGears_(numberOfGears),
        numberOfWheels_(numberOfWheels), weight_(weight) 

    // you can use the accessor functions with loose sort statements if you don't
    // need to tie many columns together

    inline unsigned get_maxSpeed() const  return maxSpeed_; 
    inline unsigned short get_numberOfHorsePower() const 
        return numberOfHorsePower_;
    
    inline unsigned short get_numberOfGears() const  return numberOfGears_; 
    inline unsigned short get_numberOfWheels() const  return numberOfWheels_; 
    inline unsigned get_weight() const  return weight_; 

    // sorting functions

    template<typename It>
    static void sort_on_speed(It first, It last) 
        std::sort(first, last,
            // a lambda receiving references to two Vehicle objects to compare
            [](const Vehicle& a, const Vehicle& b) 
                // return true if a is less than b (using the field you want)
                return a.maxSpeed_ < b.maxSpeed_;
            
       );
    

    template<typename It>
    static void sort_on_hp_plus_speed(It first, It last) 
        std::sort(first, last,
            // another lambda using std::tie to sort primarily on hp
            // and secondary on speed
            [](const Vehicle& a, const Vehicle& b) 
                return std::tie(a.numberOfHorsePower_, a.maxSpeed_) <
                       std::tie(b.numberOfHorsePower_, b.maxSpeed_);
        );
    

private:
    unsigned int maxSpeed_;
    unsigned short numberOfHorsePower_;
    unsigned short numberOfGears_;
    unsigned short numberOfWheels_;
    unsigned int weight_;
;

int main() 
    std::vector<Vehicle> cars = 
        1, 2, 3, 4, 5, 2, 3, 4, 5, 1, 3, 4, 5, 1, 2
    ;

    // sort on speed
    Vehicle::sort_on_speed(cars.begin(), cars.end());

    // sort on hp + speed
    Vehicle::sort_on_hp_plus_speed(cars.begin(), cars.end());

【讨论】:

【参考方案2】:

boost.multiindex 应该很有用。

【讨论】:

以上是关于对多个数据成员进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在Kotlin中按多个字段对集合进行排序[重复]

如何根据python中的多个条件对excel文件进​​行重复数据删除?

数据仓库 - 多个部门的重复维度成员

在多个属性上对PHP中的一组对象进行排序[重复]

在SELECT语句中,对查询结果进行排序的子句是啥?能消除重复行的关键字是啥?

对数据进行排序的最佳方法[重复]