我正在努力进行矢量排序..我之前遇到过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();
}
}
答案 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特性)作为比较谓词。