2012-11-27 67 views
1

當我嘗試對自定義對象的向量進行排序時,出現了一個奇怪的問題。我有這樣的代碼:Bad Sorting a vector objects C++

class Chromosome { 
public: 
    Chromosome(int c_w);  
    void setFitness(double fit); 
    double getFitness() const;     
}; 

和比較功能:

bool compareChromosomes(const Chromosome* l, const Chromosome* r) { 
    return l->getFitness() <= r->getFitness(); 
} 

創建染色體的載體:vector<Chromosome*> popv;和我添加一些染色體。

當我嘗試進行排序與​​sort(popv.begin(), popv.end(), compareChromosomes);

這個向量是結果:

BEFORE SORT:

cromosoma 0:0.205595

cromosoma 1:0.370121

cromosoma 2:0.363655

cromosoma 3:0.363655

cromosoma 4:0.858721

cromosoma 5:0.192359

cromosoma 6:0.582279

cromosoma 7:0.202899

cromosoma 8:0.205105

cromosoma 9:0.187058

AFTER SORT

cromosoma 0:-0.474942

cromosoma 1:0.187058

cromosoma 2:0.192359

cromosoma 3:0.202899

cromosoma 4:0.205105

cromosoma 5:0.205595

cromosoma 6:0.363655

cromosoma 7:0.363655

cromosoma 8:0.370121

cromosoma 9:0.582279

問題出在哪裏?

+0

嘗試設置內存斷點。否則,代碼是不足以說明的。 –

+0

我該怎麼做? – DrFred

回答

4

您的比較函數並不嚴格 - 對於兩個相同的染色體,它將爲compareChromosomes返回true(不管順序如何)。與不太嚴格更換您的條件:

bool compareChromosomes(const Chromosome* l, const Chromosome* r) { 
    return l->getFitness() < r->getFitness(); 
    //      | 
    //     <, not <= 
} 
+0

你當然是對的,但這個問題真的可以解釋問題中的症狀嗎? –

+0

@MarkRansom當然,如果相等被檢查爲「compare(x,y)&& compare(y,x)'。 –

+0

我可以看到這將如何產生一個不正確的順序,但它如何破壞一個元素? –

1

爲什麼0.858721更改爲-0.474942的原因是因爲你比較函數不是。 您沒有發佈的代碼必須有其他原因。 請嘗試下面的代碼:輸出是可以的。

#include <vector> 
#include <iostream> 
#include <algorithm> 

using namespace std; 

class Chromosome { 
public: 
    Chromosome(int c_w) :mCw(c_w) { } 
    void setFitness(double fit) { mFit = fit; } 
    double getFitness() const { return mFit; } 
    int getCW() const { return mCw; } 
private: 
    int mCw; 
    double mFit; 
}; 

bool compareChromosomes(const Chromosome* l, const Chromosome* r) { 
    return l->getFitness() <= r->getFitness(); 
} 

int main(int argc, char *argv[]) { 
    // init your data 
    vector<Chromosome *> popv; 
    popv.push_back(new Chromosome(0)); 
    popv[ popv.size() - 1 ]->setFitness(0.205595); 
    popv.push_back(new Chromosome(1)); 
    popv[ popv.size() - 1 ]->setFitness(0.370121); 
    popv.push_back(new Chromosome(2)); 
    popv[ popv.size() - 1 ]->setFitness(0.363655); 
    popv.push_back(new Chromosome(3)); 
    popv[ popv.size() - 1 ]->setFitness(0.363655); 
    popv.push_back(new Chromosome(4)); 
    popv[ popv.size() - 1 ]->setFitness(0.858721); 
    popv.push_back(new Chromosome(5)); 
    popv[ popv.size() - 1 ]->setFitness(0.192359); 
    popv.push_back(new Chromosome(6)); 
    popv[ popv.size() - 1 ]->setFitness(0.582279); 
    popv.push_back(new Chromosome(7)); 
    popv[ popv.size() - 1 ]->setFitness(0.202899); 
    popv.push_back(new Chromosome(8)); 
    popv[ popv.size() - 1 ]->setFitness(0.205105); 
    popv.push_back(new Chromosome(9)); 
    popv[ popv.size() - 1 ]->setFitness(0.187058); 
    // sort 
    sort(popv.begin(), popv.end(), compareChromosomes); 
    for(size_t i = 0; i < popv.size(); i++) { 
    cout << "cromosoma " << popv[i]->getCW() << ":" << popv[i]->getFitness() << endl; 
    } 

    return 0; 
}