c vector在.h .cpp中排序单独的文件

时间:2013-10-25 14:14:33

标签: c++ sorting vector

我正在努力进行矢量排序..我之前遇到过example found online并且我试图自己做一些事情,但事情进展不顺利我在线阅读了很多参考资料但他们都将“排序”功能放在主要功能中..

我正在尝试的是看看我是否可以在函数中使用include sort。

missionplan.h

class MissionPlan
{
   friend struct stortByCiv;
    private:
        int sizeofarray;
        int sizeofarray2;
        int xcordi;
        int ycordi;



    public:
        MissionPlan();
        MissionPlan(int, int, float);

        int getx();
        int gety();
        float getciv();

        void stats();
        void storedata(int, int, float);
        void test();
        void displayall();
        void compute();
        void topfives();

        float civnum;

}
struct sortByCiv 
 { void f(MissionPlan &p){ p.civnum = getciv();};
bool operator()(MissionPlan const &t1, MissionPlan const &t2) { return t1.civnum < t2.civnum; } 

}; ;

missionplan.cpp

#include "LocationData.h"
#include "PointTwoD.h"
#include "MissionPlan.h"


#include <iostream>
#include <string>
#include <algorithm> 
#include <vector>
#include <iterator>

using namespace std;

    vector <PointTwoD> point1;//set PointTwoD object as a vector array, name of array "point1"
    vector <PointTwoD> topfive;
    LocationData locationdata;
    PointTwoD pointtwoD;
    MissionPlan missionplan;

MissionPlan::MissionPlan()
{
    xcordi = 0;
    ycordi = 0;
    civnum = 0;
}

MissionPlan::MissionPlan(int x, int y, float civ)
{
    xcordi = x;
    ycordi = y;
    civnum = civ;
}   

int MissionPlan::getx()
{
    return pointtwoD.getxcord();
}

int MissionPlan::gety()
{
    return pointtwoD.getycord();
}

float MissionPlan::getciv()
{
    return locationdata.getCivIndex();
}

void MissionPlan::stats()
{
    string sunType;
    int earth;
    int moon;
    float particle;
    float plasma;
    int xcord;
    int ycord;

    cout<< "X axis: ";
    cin >> xcord;
    pointtwoD.setxcord(xcord);

    cout<< "y axis: ";
    cin >> ycord;
    pointtwoD.setycord(ycord);

    cout << "Suntype: ";
    cout.flush();//flush getline problem
    cin.ignore();
    getline(cin, sunType);
    locationdata.setsunType(sunType);

    cout << "No of Earth Like Planets: ";
    cin >> earth;
    locationdata.setnoOfEarthLikePlanets(earth);

    cout << "No of Earth Like Moons: ";
    cin >> moon;
    locationdata.setnoOfEarthLikeMoons(moon);

    cout << "Ave Particle Density: ";
    cin >> particle;
    locationdata.setaveParticulateDensity(particle);

    cout << "Ave Plasma Density: ";
    cin >> plasma;
    locationdata.setavePlasmaDensity(plasma);


    locationdata.computeCivIndex(sunType, earth, moon, particle, plasma);
    missionplan.test();
    missionplan.displayall();
}

void MissionPlan::test()
{

        int xcord = pointtwoD.getxcord();
        int ycord = pointtwoD.getycord();
        float civIndex = locationdata.getCivIndex();
        pointtwoD.setPointDetail(xcord, ycord, civIndex);
        point1.push_back(pointtwoD);//push/store new object into array

}



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();
}


 }

2 个答案:

答案 0 :(得分:3)

现在的问题是你试图定义嵌套在sortByCiv内的topfives。你不能像这样在另一个内部定义一个函数。

这里有几个选择。一个(基本上适用于任何编译器)是在sortByCiv之外定义topfives

bool sortByCiv(const  PointTwoD &t1, const  PointTwoD &t2)
{
    return t1.getciv < t2.getciv;
}

void MissionPlan::topfives() { 
    topfive.assign( point1.begin(), point1.end() ); 

    sort(topfive.begin(), topfive.end(), sortByCiv);
    // ...
 }

另一种可能性(有时候更喜欢将比较定义为重载operator()的类或结构:

struct sortByCiv {
    bool operator()(PointTwoD const &t1, PointTwoD const &t2) { 
        return t1.getciv < t2.getciv;
    }
};

当你使用它时,你需要在名称中添加一对parens来创建在排序时传递的类的实例:

sort(topfive.begin(), topfive.end(), sortByCiv());

最终的可能性(仅适用于相对较新的编译器是使用“lambda”表达式:

void MissionPlan::topfives() { 
    topfive.assign( point1.begin(), point1.end() ); 

    sort(topfive.begin(), topfive.end(),
         [](PointTD const &t1, PointTwoD const &t2) {return t1.getciv < t2.getciv; });
    // ...
 }

如果您的编译器支持它,则lambda表达式通常是首选,因为它允许您“就地”指定排序条件。

虽然它与排序无关,但显示结果的代码看起来也有点笨拙。我认为你想要的更接近:

for(int i=0; i < 5; i++)
    topfive.at(i).displayPointdata();

答案 1 :(得分:1)

从另一个函数中调用 std::sort没有任何问题。尝试在另一个函数中声明一个函数有问题(C ++中不支持嵌套函数)。因此,以下代码将无法编译:

oid MissionPlan::topfives()
{   
    bool sortByCiv(const PointTwoD &t1, const  PointTwoD  &t2);

    // ...

    bool sortByCiv(const  PointTwoD &t1, const  PointTwoD &t2)
    {
        return t1.getciv < t2.getciv;
    }
}

您可以在sortByCiv函数之外声明topfives(作为类成员或作为独立函数 - 尽管它需要friend才能访问{{1}}私有成员数据),或使用lambda函数(如果可以使用C ++ 11特性)作为比较谓词。