鍍金池/ 問(wèn)答/C++/ c++的sort函數(shù) 使用出現(xiàn)錯(cuò)誤,無(wú)法排序??

c++的sort函數(shù) 使用出現(xiàn)錯(cuò)誤,無(wú)法排序??

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
#include<string>
#include<math.h>
#include<algorithm>
#define  maxNT 100
using namespace std;


struct Point {
    double x;
    double y;
    int index;
};

struct Edge {
    Point start;//邊的起點(diǎn) 
    Point end;//邊的終點(diǎn) 
    double factor;
};

void computeDistance(Edge &e1) {//計(jì)算點(diǎn)之間的距離
    double d1=pow(e1.start.x-e1.end.x,2);
    double d2=pow(e1.start.y-e1.end.y,2);
    e1.factor= sqrt(d1+d2);

}
void outEdge(Edge e) {

    printf("(%f ,%f)->(%f,%f) ,dis:%f\n",e.start.x,e.start.y,e.end.x,e.end.y,e.factor);

}
bool compareEdge(Edge e1,Edge e2) {//比較函數(shù)

    outEdge(e1);
    outEdge(e2);
    if(e1.factor<e2.factor) {
        return true;
    }
    return false;

}



int main() {


    Edge edges[3];
    edges[0].start.x=1.0;
    edges[0].start.y=1.0;
    edges[0].end.x=2.0;
    edges[0].end.y=2.0;//設(shè)置第一條邊的起點(diǎn)和終點(diǎn)
     
    edges[1].start.x=1.0;
    edges[1].start.y=1.0;
    edges[1].end.x=2.0;
    edges[1].end.y=4.0;
    
    edges[2].start.x=2.0;
    edges[2].start.y=2.0;
    edges[2].end.x=2.0;
    edges[2].end.y=4.0;

    for( int i=0; i<3; i++ ) {
        computeDistance(edges[i]);//計(jì)算距離 
    }
    for( int i=0; i<3; i++ ) {
        outEdge(edges[i]);
    }
    int mov=3;
    sort(edges,edges+mov,compareEdge);//根據(jù)factor排序 
    for( int i=0; i<3; i++ ) {
        outEdge(edges[i]);
    }

    return 0;
}




上述代碼可以直接復(fù)制到編輯器中 運(yùn)行。

(0)代碼含義:

Edge表示邊,他有兩個(gè)坐標(biāo)點(diǎn),起點(diǎn)和終點(diǎn)。 并且有一個(gè)factor= 起點(diǎn)到終點(diǎn)的距離作為權(quán)值。 

有三個(gè)Edge 放置到一個(gè)數(shù)組edges中。 然后根據(jù)factor對(duì)數(shù)組進(jìn)行排序。排序規(guī)則是升序,也即是factor小的在前面
排序函數(shù)是:
bool compareEdge(Edge e1,Edge e2) {//比較函數(shù)

outEdge(e1);
outEdge(e2);
if(e1.factor<e2.factor) {
    return true;
}
return false;

}

在排序函數(shù)中輸出 正在被排序的 Edge信息

(1)運(yùn)行結(jié)果:

clipboard.png

(2) 從上面的輸出來(lái)看 紅色方框內(nèi) 是排序函數(shù)的輸出,發(fā)現(xiàn)dis 都是0,也就是factor都是0,這個(gè)是怎么回事??

當(dāng)前正在被排序的三條邊的信息是:

(1.000000 ,1.000000)->(2.000000,2.000000) ,dis:1.414214
(1.000000 ,1.000000)->(2.000000,4.000000) ,dis:3.162278
(2.000000 ,2.000000)->(2.000000,4.000000) ,dis:2.000000

為什么排序函數(shù)中看到的Edge信息 都是: dis 000

我使用sort 的方式不對(duì)嗎??

麻煩各位慧眼識(shí)金 點(diǎn)出錯(cuò)誤之處

回答
編輯回答
心沉

首先c語(yǔ)言沒(méi)有sort函數(shù),請(qǐng)你搞清楚c和c++的區(qū)別,這是兩個(gè)語(yǔ)言(雖然后者可以部分兼容前者)
<iostream><string><algorithm>這三個(gè)頭文件是c++的,sort在<algorithm>里定義。
還有問(wèn)題標(biāo)簽又帶了個(gè)java,不知道你這是在干嘛

然后我這里運(yùn)行沒(méi)有問(wèn)題
輸出結(jié)果是:

(1.000000 ,1.000000)->(2.000000,2.000000) ,dis:1.414214
(1.000000 ,1.000000)->(2.000000,4.000000) ,dis:3.162278
(2.000000 ,2.000000)->(2.000000,4.000000) ,dis:2.000000
(1.000000 ,1.000000)->(2.000000,4.000000) ,dis:3.162278
(1.000000 ,1.000000)->(2.000000,2.000000) ,dis:1.414214
(1.000000 ,1.000000)->(2.000000,4.000000) ,dis:3.162278
(1.000000 ,1.000000)->(2.000000,2.000000) ,dis:1.414214
(2.000000 ,2.000000)->(2.000000,4.000000) ,dis:2.000000
(1.000000 ,1.000000)->(2.000000,2.000000) ,dis:1.414214
(2.000000 ,2.000000)->(2.000000,4.000000) ,dis:2.000000
(1.000000 ,1.000000)->(2.000000,4.000000) ,dis:3.162278
(2.000000 ,2.000000)->(2.000000,4.000000) ,dis:2.000000
(1.000000 ,1.000000)->(2.000000,2.000000) ,dis:1.414214
(1.000000 ,1.000000)->(2.000000,2.000000) ,dis:1.414214
(2.000000 ,2.000000)->(2.000000,4.000000) ,dis:2.000000
(1.000000 ,1.000000)->(2.000000,4.000000) ,dis:3.162278

建議檢查編譯環(huán)境

2017年12月20日 07:14