3

我有一个向量 vec,每次在其中放入元素时都需要对其进行排序

所以当我将第一个 Upgrade* 放在向量中时,我没有问题

但是当我将第二个 Upgrade* 放入其中并调用排序例程时,我遇到了运行时错误

这就是我每次插入时放置元素并调用排序的方式

std::vector<Upgrade*> stack = getStack();

stack.push_back(element);

std::sort(stack.begin(), stack.end(), CostBenefitUpgradeOrder());

这是我的比较器

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;
    }
}

这就是错误

运行时错误

我注意到它只发生在我在调试模式下执行程序时!

4

2 回答 2

7

您的比较功能已损坏。您不能有一个true同时返回u1 < u2和的谓词u2 < u1

return u1 < u2;如果您只需要一些东西进行快速测试,请将 return 语句替换为。

另外,您确定需要使用vector? 除非您需要将指针存储在连续的内存中,否则最好使用std::set带有适当比较器的代替。将set在每次插入/删除后保持元素有序。

此外,由于您使用的是原始指针,因此如果您使用的是分配对象,请new确保delete在从容器中删除元素之前。更好的是,使用 anstd::set<std::unique_ptr<Upgrade>, CostBenefitUpgradeOrder>而不必担心删除分配的内存。

于 2012-12-12T01:10:11.533 回答
5

您需要将“严格弱排序”(小于)运算符传递给该 std::sort方法,并且该运算符必须是“有效的”。

有效的 operator< 具有以下属性:

  • 对于所有人来说X,情况并非如此X< X(非自反性)。对所有人来说X
  • 是的, 如果X<是的则不是 y < x (不对称)。对所有人
  • X, 是的, and z, if X< 是的and 是的< zthen X< z(传递性)。对所有人来说X
  • 是的, 和z, 如果X与 不可比是的, 且 与是的不可比z, 则不X可比z(transitivity of incomparability).

您可以看到您的操作员在第一点(CostBenefitUpgradeOrder(x, x) == true在您的情况下为 )(以及大多数其他点)失败。

于 2012-12-12T01:07:51.190 回答