对对象向量进行排序

Sort a vector of objects

本文关键字:排序 向量 对象      更新时间:2023-10-16

我正在使用一个简单的c++程序,这个类:(我是一个非常初级的程序员(

class Car{
private:
    string newBrand;
    int newMileage;
    int newYear;
    double newPrice;

(我没有公布公开课(

bool sortByName(Car &CarVector) 
{ 
    return CarVector.getBrand() < CarVector.getBrand(); 
}

Main:

int main(){
    vector<Car> CarVector;
    ReadFile(CarVector);
    ListCar(CarVector);
    return 0;
}

LIst汽车函数,当我调用函数"排序"时,按名称对我的对象向量排序:

void ListCar(vector<Car>&CarVector){
    int i, op;
    system("CLS");
    sort(CarVector.begin(), CarVector.end(), sortByName);
    cout << "MENU::CAR LIST BY NAME" << endl;
    cout << ":Brand: t:Mileage: t:Year: tt:Price:" << endl;
    for(i=0; i<CarVector.size();i++)
    {
        cout << CarVector[i].getBrand() << " tt";
        cout << CarVector[i].getMileage() << " tt";
        cout << CarVector[i].getYear() << " tt";
        cout << CarVector[i].getPrice() << " tt";
        cout << endl;
    }
    do
    {
    cout << endl << "1.Back: ";
    cin >> op;
    }while(op!=1);
}

我认为这个程序应该有效。你能帮我找出错误吗?向致以最良好的问候

在比较函数中,您需要使用两个参数:它应该将这些对象相互比较。此外,它独立于任何向量(它对向量的元素进行操作(,因此不应该这样命名参数以避免混淆。

因此,功能可能看起来像这样:

bool sortByName(Car &a, Car &b) 
{ 
    return a.getBrand() < b.getBrand(); 
}

此外,将const添加到通过引用传递的参数中是一个很好的选择(但并不总是必需的(,以表明函数体不会修改它们:

bool sortByName(const Car &a, const Car &b) 
{ 
    return a.getBrand() < b.getBrand(); 
}

但是,有必要将const放在函数Car::getBrand()的签名末尾,以表明该函数不会修改其操作的对象。这被称为常量正确性。如前所述,该过程并不总是必需的(就像使用std::sort时一样(,但具有常量正确性是一种很好的风格。

或者,如果编译器支持lambda,也可以使用它(需要启用C++11支持(:

std::sort(CarVector.begin(), CarVector.end(), [](const Car &a, const Car &b){
    return a.getBrand() < b.getBrand();
});

请注意,如果要始终按名称比较cars,那么为类实现operator<是有意义的。执行此操作时,不需要在对std::sort的调用中指定比较函数,因为这些对象只需像a < b而不是yourFunction(a, b)那样进行比较。

bool sortByName(Car &CarVector1,Car &CarVector2) 
{ 
    return CarVector1.getBrand() < CarVector2.getBrand(); 
}

使用此sortByName

您必须在sortByName方法中传递两个Car对象才能将两个对象比较为:

bool sortByName(Car &C1,Car &C2) 
{ 
    return C1.getBrand() < C2.getBrand(); 
}

查看此链接以了解更多详细信息