我有这个班级
Class VehicleTwoD
{
private:
doubleArea;
}
所以我想按doubleArea排序;
在我的main.cpp
我得到了
int main()
{
VehicleTwoD *vehicletwod[100];
sort(vehicletwod[0], vehicletwod[vehicleCounter]);
for (int i=0;i<vehicleCounter;vehicleCounter++)
{
cout << "Vehicle " << i << end;
cout << vehicletwod[i]->toDisplay() << endl;
}
}
Below is my operator overload at Vehicle.h
bool VehicleTwoD::operator<(const VehicleTwoD& rhs) const
{
return area > rhs.area;
}
当我尝试运行程序时,我在运行时遇到错误 - 分段核心转储错误。
假设我的车辆计数器没有错,当我尝试运行显示时,我的Vehicletwod至少得到了2个对象,那么实际上是错误的。
更新:
由于我从专家那里得到了宝贵的反馈意见,我这样做了。
在main.cpp
int main()
{
VehicleTwoD *vehicletwod[100];
for(int i=0;i<100;i++)
{
vehicletwod[i] = new VehicleTWoD();
}
//some computation then I go to sort..
sort(&vehicletwod[0],&vehicletwod[vehicleCounter]);
for(int i=0;i<vehicleCounter;i++)
{
cout << vehicletwod->toDisplay() << endl;
}
}
输出保持不变,没有任何排序..我不知道为什么..
这是我在VehicleTwoD.h上做的布尔运算符
VehicleTwoD.h
public:
bool operator<(const VehicleTwoD&) const;
VehicleTwoD.cpp
bool VehicleTwoD::operator<(const VehicleTwoD& rhs) const
{
return area > rhs.area;
}
什么都没有排序..我希望至少它可以降序或升序......
我很想知道是否可以将我的VehicleTwoD数组分配到向量调用sortVector中,因为在按升序排序之后,我还要按降序排序。
因此向量中的反向函数将很好地解决它。
有什么建议吗?感谢所有有帮助和善良的专家!
答案 0 :(得分:3)
VehicleTwoD *vehicletwod[100];
这只会创建一个指向无效内存位置的引用数组。
您需要循环或其他方式来分配100个有效引用。例如:
for(int i=0;i < 100;i++)
{
vehicletwod[i] = new VehicleTwoD() ;
}
你必须记住释放那些记忆。
答案 1 :(得分:2)
好吧,vehicletwod[i]->toDisplay()
是UB,因为vehicletwod[i]
(无论i
是什么)永远不会被初始化。
VehicleTwoD *vehicletwod[100];
只创建一个包含100个悬空指针的数组。
我建议您使用std::vector<std::unique_ptr<VehicleTwoD>>
代替(因为看起来您的类是多态的,并且您需要多态行为)。
答案 2 :(得分:2)
你的程序中有很多错误。
VehicleTwoD *vehicletwod[100];
创建一个包含100个未初始化指针的数组到VehicleTwoD
sort(vehicletwod[0], vehicletwod[vehicleCounter]);
对由两个指针vehicletwod[0]
和vehicletwod[vehicleCounter]
定义的范围进行排序。由于数组未初始化,这些指针是垃圾,因此排序会破坏内存。
您可能需要以下
std::vector<VehicleTwoD> vehicletwod; // vector of instances
// initialize the vector
// ...
sort(vehicletwod.begin(), vehicletwod.end());
答案 3 :(得分:2)
添加其他人所说的这是一个可编译的示例(针对反向排序更新/更新为静态类比较函数):
而不是重载&lt;运营商您可能要考虑进行排序 方向显式,例如通过指定静态比较器,如下所示。 我更喜欢这个选项,因为它允许你记录你的意图。
在Vehicle.h中:
#include <random>
class VehicleTwoD
{
private:
double area;
public:
VehicleTwoD()
{
area = ((double)rand()/(double)RAND_MAX);
}
double toDisplay()
{
return area;
}
bool VehicleTwoD::operator<(const VehicleTwoD& rhs) const
{
return area > rhs.area;
}
static bool VehicleTwoD::greater(const VehicleTwoD &lhs, const VehicleTwoD &rhs)
{
return lhs.area > rhs.area;
}
static bool VehicleTwoD::lesser(const VehicleTwoD &lhs, const VehicleTwoD &rhs)
{
return lhs.area < rhs.area;
}
};
并在main.cpp中:
#include "Vehicle.h"
#include <vector>
#include <time.h>
#include <algorithm>
#include <iostream>
int main()
{
srand((unsigned)time(NULL));
std::vector<VehicleTwoD> vehicles(100);
std::vector<VehicleTwoD>::iterator it;
sort(vehicles.begin(), vehicles.end());
for(it = vehicles.begin(); it != vehicles.end(); it++)
{
std::cout << "Vehicle area -> " << it->toDisplay() << std::endl;
}
std::cout << "Press any key..." << std::endl;
std::cin.get();
// reverse sort - note that rbegin() rend() may be second-class citizens
// depending on your compiler's implementation and that their use may therefore
// be limited
sort(vehicles.rbegin(), vehicles.rend());
for(it = vehicles.begin(); it != vehicles.end(); it++)
{
std::cout << "Vehicle area -> " << it->toDisplay() << std::endl;
}
std::cout << "Press any key..." << std::endl;
std::cin.get();
// or (document your intention)
sort(vehicles.begin(), vehicles.end(), VehicleTwoD::greater);
for(it = vehicles.begin(); it != vehicles.end(); it++)
{
std::cout << "Vehicle area -> " << it->toDisplay() << std::endl;
}
std::cout << "Press any key..." << std::endl;
std::cin.get();
sort(vehicles.begin(), vehicles.end(), VehicleTwoD::lesser);
for(it = vehicles.begin(); it != vehicles.end(); it++)
{
std::cout << "Vehicle area -> " << it->toDisplay() << std::endl;
}
std::cout << "Press any key..." << std::endl;
vehicles.clear();
std::cin.get();
return 0;
}