对对象矢量进行排序

时间:2014-06-09 12:13:00

标签: c++ sorting vector

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

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

(我没有发布公开课)

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

主:

int main(){

    vector<Car> CarVector;
    ReadFile(CarVector);
    ListCar(CarVector);

    return 0;
}

LIst Car Functions,当我调用函数“sort”时,按名称命令我的对象向量:

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: \t\t:Price:" << endl;

    for(i=0; i<CarVector.size();i++)
    {
        cout << CarVector[i].getBrand() << " \t\t";
        cout << CarVector[i].getMileage() << " \t\t";
        cout << CarVector[i].getYear() << " \t\t";
        cout << CarVector[i].getPrice() << " \t\t";
        cout << endl;
    }

    do
    {
    cout << endl << "1.Back: ";
    cin >> op;
    }while(op!=1);
}

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

3 个答案:

答案 0 :(得分:5)

在比较功能中,您需要使用两个参数:它应该将这些对象相互比较。此外,它独立于任何向量(它在向量的元素上运行),所以你不应该为这些参数命名以避免混淆。

所以函数看起来像这样:

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()签名的末尾,以表明该函数不会修改它运行的对象上。这称为 const-correctness 。如前所述,并不总是需要该过程(例如使用std::sort时),但是具有const正确性的好方法。

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

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

请注意,如果您要总是按照名称​​比较汽车,那么为您的班级实施operator<是有意义的。这样做时,您无需在调用std::sort时指定比较函数,因为这些对象只需与a < b而不是yourFunction(a, b)进行比较。

答案 1 :(得分:1)

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

使用此sortByName

答案 2 :(得分:1)

您必须以sortByName方法传递两个Car对象,将两个对象比较为:

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

查看此link了解更多详情