1

我对 C++ 很陌生,我的问题可能听起来很傻,但我正在研究使用向量的排序函数。

该代码能够编译和运行,但它只是没有排序。我可以知道原因吗?

任务计划.cpp

bool MissionPlan::sortByCiv(const PointTwoD &t1, const PointTwoD &t2)
{
    return t1.locationdata.getCivIndex() > t2.locationdata.getCivIndex();
}

void MissionPlan::topfives()
{   
    topfive.assign( point1.begin(), point1.end() ); 
    sort(topfive.begin(), topfive.end(), sortByCiv);
    for(int i=0; i < 5; i++)
    {
        topfive.at(i).displayPointdata();
    }
}

pointtwod.h

class PointTwoD
{
    private:
        int xcord,ycord;
        float civIndex;
        //LocationData locationdata;

    public:
        PointTwoD();

        PointTwoD(int, int, float);


        string toString();
        void setPointDetail(int x, int y, float civ);
        void displayPointdata();
        void storedata(int, int, float);

        //set/mutator function
        void setxcord(int);
        void setycord(int);

        //get/accessor function
        int getxcord();
        int getycord();
        float getcivIndex();

        LocationData locationdata;


};

位置数据.h

class LocationData
{
  private:
    string sunType;
    int noOfEarthLikePlanets, noOfEarthLikeMoons;
    float aveParticulateDensity, avePlasmaDensity;
    static float civIndex;

  public:
    LocationData(); //default constructor

    LocationData(string, int, int, float, float); // no default constructor
    void setLocationData(string, int, int, float, float);
    void displaydata();
    string toString();

    //'set' mustator function
    void setsunType(string);
    void setnoOfEarthLikePlanets(int);
    void setnoOfEarthLikeMoons(int);
    void setaveParticulateDensity(float);
    void setavePlasmaDensity(float);

    //'get' accessor function
    string getsunType();
    int getnoOfEarthLikePlanets();
    int getnoOfEarthLikeMoons();
    float getaveParticulateDensity();
    float getavePlasmaDensity();
    static float getCivIndex();

    static float computeCivIndex(string st, int earth, int moons, float particle, float plasma);

};

我还有一个问题.. bool myfunction (int i,int j) { return (i

我期待的结果

X: 4  Y: 9 CIV: 10
X: 1  Y: 2 CIV: 5
X: 5  Y: 4 CIV: 4
X: 6  Y: 1 CIV: 3
X: 10 Y: 6 CIV: 1

以及我从我的 prog 收到的结果,它与我输入它们的方式完全相同。

X: 10 Y: 6 CIV: 1
X: 5  Y: 4 CIV: 4
X: 4  Y: 9 CIV: 10
X: 1  Y: 2 CIV: 5
X: 6  Y: 1 CIV: 3
X: 5  Y: 9 CIV: 8
4

1 回答 1

2

除非我严重错误地阅读了您的代码,否则您调用的是错误的getCivIndex(). 您正在调用的是使用静态类变量。这意味着LocationData(包括PostTwoD对象中的内部实例)的所有实例共享相同的静态变量,因此具有相同的相同值。换句话说,您的比较器总是返回false,因为 N > N 永远不会为真。因此,您的排序根本行不通。

我相信您想使用;的getcivIndex()实例成员 PointTwoD不是的静态类成员LocationData

有几件事应该改变才能“修复”

首先,改变这个:

float getcivIndex();

对此:(原因将在一分钟内显而易见)

float getcivIndex() const;

您还必须更改此函数的实现,无论它在哪里,以添加const到它的定义中。

接下来,改变这个:

bool MissionPlan::sortByCiv(const PointTwoD &t1, const PointTwoD &t2)
{
    return t1.locationdata.getCivIndex() > t2.locationdata.getCivIndex();
}

对此:

bool MissionPlan::sortByCiv(const PointTwoD &t1, const PointTwoD &t2)
{
    // use object instance-member. note: this is why getcivIndex()
    //  had to be made const. The t1 and t2 objects are const and as
    //  such only const-member-functions are callable.
    return t1.getcivIndex() > t2.getcivIndex();
}

如果您想要的只是序列中的“前 N 个”结果,我建议您查看我关于使用std::partial_sort而不是完整排序的评论。

于 2013-10-26T10:40:10.860 回答