你如何构建比较函数?

jas*_*ray 4 c++ language-features coding-style lexicographic stdtuple

我经常遇到情况,特别是在C++中进行排序,我在比较一系列字段以比较更大的结构.一个简化的例子:

struct Car{
    Manufacturer make;
    ModelName model;
    Year year;
};

bool carLessThanComparator( const Car & car1, const Car & car2 ){
    if( car1.make < car2.make ){
        return true;
    }else if( car1.make == car2.make ){
        if( car1.model < car2.model ){
            return true;
        }else if( car1.model == car2.model ){
            if( car1.year < car2.year ){
                return true;
            }
        }
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

我的本能方法似乎很麻烦,特别是对于超过3个领域.你将如何在C++中构建这一系列的比较?其他语言是否提供更简洁或优雅的语法?

Cra*_*rks 5

好吧,如果你的函数在if子句中返回一个返回值,那么就不需要显式的else,因为它已经被拯救了.这可以节省"缩进谷":

bool carLessThanComparator( const Car & car1, const Car & car2 ) {
    if( car1.make < car2.make )
        return true;

    if ( car1.make != car2.make )
        return false;

    if( car1.model < car2.model )
        return true;

    if( car1.model != car2.model )
        return false;

    if( car1.year < car2.year )
        return true;

    return false;
}
Run Code Online (Sandbox Code Playgroud)

我也喜欢MarkusQ的LISPish短路方法.