c++的sort函数 使用出现错误,无法排序??

#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;//边的起点 
    Point end;//边的终点 
    double factor;
};

void computeDistance(Edge &e1) {//计算点之间的距离
    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) {//比较函数

    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;//设置第一条边的起点和终点
     
    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]);//计算距离 
    }
    for( int i=0; i<3; i++ ) {
        outEdge(edges[i]);
    }
    int mov=3;
    sort(edges,edges+mov,compareEdge);//根据factor排序 
    for( int i=0; i<3; i++ ) {
        outEdge(edges[i]);
    }

    return 0;
}




上述代码可以直接复制到编辑器中 运行。

(0)代码含义:

Edge表示边,他有两个坐标点,起点和终点。 并且有一个factor= 起点到终点的距离作为权值。 

有三个Edge 放置到一个数组edges中。 然后根据factor对数组进行排序。排序规则是升序,也即是factor小的在前面
排序函数是:
bool compareEdge(Edge e1,Edge e2) {//比较函数

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

}

在排序函数中输出 正在被排序的 Edge信息

(1)运行结果:

clipboard.png

(2) 从上面的输出来看 红色方框内 是排序函数的输出,发现dis 都是0,也就是factor都是0,这个是怎么回事??

当前正在被排序的三条边的信息是:

(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

为什么排序函数中看到的Edge信息 都是: dis 000

我使用sort 的方式不对吗??

麻烦各位慧眼识金 点出错误之处

阅读 1.8k
评论
    1 个回答
    • 683

    首先c语言没有sort函数,请你搞清楚c和c++的区别,这是两个语言(虽然后者可以部分兼容前者)
    <iostream><string><algorithm>这三个头文件是c++的,sort在<algorithm>里定义。
    还有问题标签又带了个java,不知道你这是在干嘛

    然后我这里运行没有问题
    输出结果是:

    (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
    

    建议检查编译环境