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