thi*_*goh 3 c++ sorting stl runtime-error vector
我有一个矢量vec,每次我在其中放入一个元素时我需要对它进行排序
所以当我把第一个升级*放在向量中时我没有问题
但是当我在其中放入第二个Upgrade*并调用sort例程时,我遇到了运行时错误
这是我每次插入时放置元素和调用排序的方式
std::vector<Upgrade*> stack = getStack();
stack.push_back(element);
std::sort(stack.begin(), stack.end(), CostBenefitUpgradeOrder());
Run Code Online (Sandbox Code Playgroud)
这是我的比较器
struct CostBenefitUpgradeOrder {
bool operator ()(const Upgrade * u1, const Upgrade * u2) const {
const UpgradeType upgradeType1 = u1->getUpgradeType();
const UpgradeType upgradeType2 = u2->getUpgradeType();
int price1 = PriceUtil::getPrice(upgradeType1);
int price2 = PriceUtil::getPrice(upgradeType2);
if (price2 < price1)
return true;
else
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
这是错误

我注意到它只发生在我在调试模式下执行程序时!
您的比较功能已损坏.你不能有一个返回谓词true两个u1 < u2和u2 < u1.
return u1 < u2;如果您只需要快速测试的东西,请将return语句替换为.
另外,你确定需要使用vector?除非您需要将指针存储在连续的内存中,否则最好使用std::set相应的比较器.该set会每隔插入/缺失之后订购的元素.
此外,由于您正在使用原始指针,因此如果您正在使用分配对象,请new确保delete在从容器中删除元素之前.更好的是,使用一个std::set<std::unique_ptr<Upgrade>, CostBenefitUpgradeOrder>而不必担心删除分配的内存.
您需要将"严格弱排序"(小于)运算符传递给 std::sort方法,并且该运算符必须"有效".
有效运算符<具有以下属性:
,情况并非如此
<
(irreflexivity).对全部
,
如果
<
那么y <x(不对称)并非如此.对全部
,
,和
如果
<
和
<
然后
<
(传递).对全部
,
,和
如果
是无与伦比的
,和
是无与伦比的
, 然后
是无与伦比的
(不可比性的传递性).您可以看到您的操作员在第一个点(CostBenefitUpgradeOrder(x, x) == true在您的情况下)(以及大多数其他点)上失败.