簡體   English   中英

c ++指針錯誤的排序向量

[英]c++ sort vector of pointers error

我有一個矢量vec,每次我在其中放入一個元素時我需要對它進行排序

所以當我把第一個升級*放在矢量中時我沒有問題

但是當我在其中放入第二個Upgrade *並調用sort例程時,我遇到了運行時錯誤

這是我每次插入時放置元素和調用排序的方式

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

這是錯誤

運行時錯誤

我注意到它只發生在我在調試模式下執行程序時!

您的比較功能已損壞。 對於u1 < u2u2 < u1 ,你不能有一個返回true的謂詞。

將return語句替換為return return u1 < u2; 如果你只需要一些快速測試的東西。

此外,您確定需要使用vector嗎? 除非你需要將指針存儲在連續的內存中,否則最好使用std::set而不是使用適當的比較器。 set將在每次插入/刪除后保持元素排序。

此外,由於你使用原始指針,如果你使用分配對象的new確保您delete去除容器中的元素之前。 更好的是,使用std::set<std::unique_ptr<Upgrade>, CostBenefitUpgradeOrder>而不必擔心刪除分配的內存。

您需要將“嚴格弱排序”(小於)運算符傳遞給std::sort方法,並且該運算符必須為“有效”。

有效運算符<具有以下屬性:

  • 對全部 X ,情況並非如此 X < X (irreflexivity)。 對全部 X
  • ÿ 如果 X < ÿ 那么y <x(不對稱)並非如此。 對全部
  • X ÿ ,和 ž 如果 X < ÿ ÿ < ž 然后 X < ž (傳遞)。 對全部 X
  • ÿ ,和 ž 如果 X 是無與倫比的 ÿ ,和 ÿ 是無與倫比的 ž , 然后 X 是無與倫比的 ž (不可比性的傳遞性)。

您可以看到您的操作員在第一點失敗( CostBenefitUpgradeOrder(x, x) == true ,在您的情況下)(以及大多數其他點)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM