C++ c.h.cpp中的向量排序独立文件

C++ c.h.cpp中的向量排序独立文件,c++,sorting,vector,C++,Sorting,Vector,我正在努力进行向量排序。。我之前遇到过一个问题,我试图自己做一些事情,但不知怎么的事情进展不顺利,我在网上读了很多参考资料,但它们都将“sort”函数放在了主函数中 我正在尝试的是看看是否可以在函数中使用includesort 任务计划 class MissionPlan { friend struct stortByCiv; private: int sizeofarray; int sizeofarray2; int xcordi

我正在努力进行向量排序。。我之前遇到过一个问题,我试图自己做一些事情,但不知怎么的事情进展不顺利,我在网上读了很多参考资料,但它们都将“sort”函数放在了主函数中

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

任务计划

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; } 
类任务计划
{
friend struct stortByCiv;
私人:
int-sizeofarray;
int sizeofarray2;
int-xcordi;
int-ycordi;
公众:
任务计划();
任务计划(整数,整数,浮动);
int getx();
int gety();
float getciv();
void stats();
void存储数据(int、int、float);
无效试验();
void displayall();
void compute();
void topfifes();
浮雕;
}
结构sortByCiv
{void f(MissionPlan&p){p.civnum=getciv();};
bool运算符()(MissionPlan const&t1,MissionPlan const&t2){return t1.civnum
}); ;

任务计划

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


 }
#包括“LocationData.h”
#包括“PointTwoD.h”
#包括“任务计划.h”
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
向量点1//将PointTwoD对象设置为向量数组,数组名称为“point1”
向量前五名;
位置数据位置数据;
两点两点两点;
任务计划任务计划;
任务计划::任务计划()
{
xcordi=0;
ycordi=0;
civnum=0;
}
任务计划:任务计划(整数x,整数y,浮动civ)
{
xcordi=x;
ycordi=y;
civnum=civ;
}   
int任务计划::getx()
{
返回点twod.getxcord();
}
int任务计划::gety()
{
返回点twod.getycord();
}
浮动任务计划::getciv()
{
返回locationdata.getCivIndex();
}
作废任务计划::stats()
{
弦太阳型;
地球内部;
月内;
漂浮颗粒;
浮动等离子体;
int xcord;
int ycord;
cout>xcord;
第二点D.setxcord(xcord);
cout>ycord;
第二点D.集合词(ycord);
地球;
位置数据。setnoOfEarthLikePlanets(地球);
月亮;
位置数据:Setnoofearthlikemons(月球);
cout>粒子;
位置数据。设置特定密度(粒子);
cout>血浆;
位置数据:setavePlasmaDensity(血浆);
位置数据。计算CIVINDEX(太阳类型、地球、月球、粒子、等离子体);
任务计划测试();
missionplan.displayall();
}
无效任务计划::测试()
{
int xcord=pointtwoD.getxcord();
int ycord=pointtwoD.getycord();
float civIndex=locationdata.getCivIndex();
pointtwoD.setPointDetail(xcord、ycord、civIndex);
point1.push_back(pointtwoD);//将新对象推/存储到数组中
}
作废任务计划::topfives()
{   
赋值(point1.begin(),point1.end());
排序(topfive.begin()、topfive.end()、sortByCiv);
对于(int i=0;i<5;i++)
{
topfive.at(i).displayPointdata();
}
}

从另一个函数中调用
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;
    }
}
oid任务计划::topfives()
{   
bool-sortByCiv(常量两点D&t1、常量两点D&t2);
// ...
布尔索特比奇夫(常量两点D和t1,常量两点D和t2)
{
返回t1.getciv

您可以在
topfifes
函数之外声明
sortByCiv
(作为类成员或作为独立函数-尽管它需要是
friend
才能访问私有成员数据),或者使用lambda函数(如果您可以使用C++11功能)对于您的比较谓词。

现在的问题是,您试图定义嵌套在
topfives
中的
sortByCiv
。你不能在一个函数中定义另一个函数

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

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);
    // ...
 }
使用此选项时,需要在名称中添加一对参数,以创建排序时将传递的类的实例:

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; });
    // ...
 }
void MissionPlan::topfifes(){
赋值(point1.begin(),point1.end());
排序(topfive.begin(),topfive.end(),
[](PointTD const&t1,PointTwoD const&t2){返回t1.getciv
如果编译器支持,则通常首选lambda表达式,因为它允许您“就地”指定排序条件

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

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

你不能在另一个函数中定义一个函数。你应该尝试一个小的例子,包含足够的代码来重现错误,但是没有更多。这里的代码大部分是不相关的。所以唯一的方法是做我自己的手工排序?@克里斯蒂,因为我仍然是真正的C++新手,因为我试图在CIV值和我的CIV中对它们进行实际排序。那么我如何访问它呢?@koi_s3ng:你可以公开它,添加访问者,或者让
MissionPlan
成为
PointTwoD
的朋友。如果PointTwoD没有对
civ
值施加任何约束,我就公开它。@koi_s3ng你已经声明了
getciv
访问者。你只需在y中调用它们我们的lambda函数进行比较:
返回t1.getciv()
@JerryCoffin谢谢Jerry,我刚刚在que中编辑了代码,并用**标记。你能帮我检查一下这是否是正确的方法吗?非常感谢你的帮助…看起来很合理——但为了其他人的利益
for(int i=0; i < 5; i++)
    topfive.at(i).displayPointdata();