用行排序列

时间:2011-05-04 17:37:26

标签: c++ sorting

我有一组点(x,y,z)。我想使用第一列对这些数据进行排序,第二列和第三列应根据排序第一列重新排列。是否可以在c ++中执行此操作,如果是这样,请帮助我。

这里我附上了我的实现代码,但是我在第31行和第32行收到了一条错误消息“从'const'vod *'无效转换为'const int [*] [3]'”。我尝试使用几个方法,但我的努力还没有成功。我在这里使用'qsort',有没有其他方法或者我可以使用'sort'来做到这一点。由于我有一个非常大的数据集,我希望使用快速方法。 所以我最后需要的是只使用第一列排序的数据集,如下例所示: 排序之前

34  12  12
12  34 15
24  20  34
13  11  10
40  23  32
排序后

12  34 15
13  11  10
24  20  34
34  12  12
40  23  32

如果有任何好的方法可以帮助我编写代码......谢谢

#include <iostream>
#include <cstdlib>
#include <vector>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

class Point
{
   private:          
    double x;
    double y;
    double z;

   public:
     Point(){};
     ~Point(){};

   Point(double X, double Y, double Z){
     x=X;y=Y;z=Z; }

   double X(){return x;}
   double Y(){return y;}
   double Z(){return z;}
};

int cmp ( const void *pa, const void *pb ) {
const int (*a)[3] = pa;
const int (*b)[3] = pb;
if ( (*a)[1] < (*b)[1] ) return -1;
if ( (*a)[1] > (*b)[1] ) return +1;
return 0;
}

int main ( ) {
vector<Point> points;
int input_x,input_y,input_z;       
   int i=0;
   while(i<6){//data set,it is a example, actual data come from a file 

         cout<<"x: ";cin>>input_x;
         cout<<"y: ";cin>>input_y;
         cout<<"z: ";cin>>input_z;
         Point point(input_x,input_y,input_z);                        
         points.push_back(point);
        i++;                         
         }        
for (int i=0;i<points.size();i++){//before sort
cout<<points[i].X()<<" "<<points[i].Y()<<" "<<points[i].Z()<<endl;
}

qsort( points, 6, sizeof points[0], cmp );

for (int i=0;i<points.size();i++){//after sort
cout<<points[i].X()<<" "<<points[i].Y()<<" "<<points[i].Z()<<endl;
}            
system("PAUSE");
return 0;
}

2 个答案:

答案 0 :(得分:1)

使用std::sort代替qsort几乎肯定最简单:

class Point { 
    int x, y, z;
public:
    Point(int x, int y, int z) : x(x), y(y), z(z) {}

    bool operator<(Point const &other) { 
        return x < other.x;
    }
    // skipping the reading and other stuff for now...
};

int main() { 
    std::vector<Point> points;
    // add some Points to `points` here.

    // sort using order defined in Point::operator<:
    std::sort(points.begin(), points.end());
    return 0;
}

编辑:为了使比较与被比较的项目分开,您使用单独的函数或仿函数进行比较,并将其传递给std::sort。在任何情况下,您的班级都有一些您真正想要改变的事情 - 至少,因为您的Point::X()Point::Y()Point::Z()不会修改Point对象,你想让它们const成员函数。完成后,排序非常简单:

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

class Point { 
    double x, y, z;
public:
    double X() const { return x; }
    double Y() const { return y; }
    double Z() const { return z; }

    Point(double x=0.0, double y=0.0, double z=0.0) : x(x), y(y), z(z) {}
};

namespace std { 
ostream &operator<<(ostream &os, Point const &p) { 
    return os << "(" << p.X() << ", " << p.Y() << ", " << p.Z() << ")";
}
}
struct byX { 
    bool operator()(Point const &a, Point const &b) { 
        return a.X() < b.X();
    }
};

int main(){ 
    std::vector<Point> points;

    for (int i=0; i<10; i++)
        points.push_back(Point(rand(), i, i));

    std::cout << "Unsorted:\n";
    std::copy(points.begin(), points.end(), 
        std::ostream_iterator<Point>(std::cout, "\n"));

    std::sort(points.begin(), points.end(), byX());

    std::cout << "\nSorted:\n";
    std::copy(points.begin(), points.end(), 
        std::ostream_iterator<Point>(std::cout, "\n"));
    return 0;
}

从技术上讲,我想我应该添加一个小细节:如果你的任何一点中的x值是NaN,这将无法正常工作。 NaN不等于任何违反std::sort所要求的严格弱序的任何东西(甚至不是自身)。

答案 1 :(得分:0)

cmp函数的参数实际上是const Point *px。您可能无法以这种方式将它们声明为参数,但您可以确定cast以后的void指针。

进一步参考here