c ++指针错误的排序向量

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)

这是错误

运行时错误

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

Pra*_*ian 7

您的比较功能已损坏.你不能有一个返回谓词true两个u1 < u2u2 < u1.

return u1 < u2;如果您只需要快速测试的东西,请将return语句替换为.

另外,你确定需要使用vector?除非您需要将指针存储在连续的内存中,否则最好使用std::set相应的比较器.该set会每隔插入/缺失之后订购的元素.

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


Nem*_*ric 5

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

有效运算符<具有以下属性:

  • 对全部 X,情况并非如此 X < X(irreflexivity).对全部X,
  • ÿ如果 X < ÿ那么y <x(不对称)并非如此.对全部
  • X, ÿ,和 ž如果 X < ÿÿ < ž 然后 X < ž(传递).对全部X,
  • ÿ,和 ž如果 X 是无与伦比的 ÿ,和 ÿ 是无与伦比的 ž, 然后 X 是无与伦比的 ž (不可比性的传递性).

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