首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量对象C++排序错误

向量对象C++排序错误
EN

Stack Overflow用户
提问于 2012-11-27 17:56:44
回答 2查看 88关注 0票数 1

当我试图对自定义对象的向量排序时,我遇到了一个奇怪的问题。我有这样的代码:

代码语言:javascript
复制
class Chromosome {
public:
   Chromosome(int c_w);       
   void setFitness(double fit);
   double getFitness() const;                
};

并比较功能:

代码语言:javascript
复制
bool compareChromosomes(const Chromosome* l, const Chromosome* r) {
   return l->getFitness() <= r->getFitness();
}

我创造了染色体的载体:vector<Chromosome*> popv;和一些染色体。

当我尝试用sort(popv.begin(), popv.end(), compareChromosomes);对向量排序时

其结果是:

排序前:

文蛤瘤0: 0.205595

文蛤瘤1: 0.370121

文蛤瘤2: 0.363655

文蛤瘤3: 0.363655

cromosoma 4: 0.858721

文蛤瘤5: 0.192359

文蛤瘤6: 0.582279

文蛤瘤7: 0.202899

文蛤瘤8: 0.205105

文蛤瘤9: 0.187058

后排序

cromosoma 0:-0.474942

文蛤瘤1: 0.187058

文蛤瘤2: 0.192359

文蛤瘤3: 0.202899

文蛤瘤4: 0.205105

文蛤瘤5: 0.205595

文蛤瘤6: 0.363655

文蛤瘤7: 0.363655

文蛤瘤8: 0.370121

文蛤瘤9: 0.582279

问题出在哪里?

EN

回答 2

Stack Overflow用户

发布于 2012-11-27 17:58:05

您的比较函数并不严格-对于两个相同的染色体,它返回truecompareChromosomes (不管顺序)。用严格少替换您的条件

代码语言:javascript
复制
bool compareChromosomes(const Chromosome* l, const Chromosome* r) {
   return l->getFitness() < r->getFitness();
   //                     |
   //                  <, not <=
}
票数 4
EN

Stack Overflow用户

发布于 2012-11-29 10:58:01

0.858721改为-0.474942的原因不是因为您的比较函数。您没有发布的代码肯定还有其他原因。尝试下面的代码:输出正常。

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13590214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档