按x值排序坐标

时间:2010-10-05 07:38:50

标签: c++

我有以下代码:

#include <vector>
using namespace std;
struct Point
{
  int x, y;
};
bool Sort(struct Point& a,struct  Point& b){
  return a.x<b.x;
}
int main(int argc, char *argv[])
{
  vector<Point>a;
  for (int i=0;i<10;i++){
    cin>>a[i].x>>a[i].y;
  }
  sort(a,10,Sort);
  system("PAUSE");
  return EXIT_SUCCESS;
}

但似乎错了。你能告诉我使用的排序功能的正确形式吗?

5 个答案:

答案 0 :(得分:4)

你应该这样称呼它:

sort( a.begin(), a.end(), Sort);

http://www.cplusplus.com/reference/algorithm/sort/

答案 1 :(得分:3)

您需要为sort函数指定开始和结束迭代器。这可以通过使用a.begin()a.end()函数来完成。

std::sort( a.begin(), a.end(), Sort); 

另外, 谓词defn'应该是:

bool Sort(const Point& a,const Point& b) const

{

答案 2 :(得分:2)

您的案例中的另一个解决方案是使用列表而不是向量并重载运算符&lt;

#include <iostream>
#include <algorithm>
#include <list>

struct Point
{
    int x, y;

    bool operator<( const Point & p )
    { return this->x < p.x; }
};

void print( Point p )
{
    std::cout << "Point (x,y): (" << p.x <<", " << p.y << ")" << std::endl;
}

// just for example
bool Reverse( const Point &p1, const Point &p2 )
{ return p1.x > p2.x; }

int main( )
{
    std::list<Point> a;

    for( int i = 0; i < 10; ++i) 
    {
        Point p;
        std::cin >> p.x >> p.y;
        a.push_back( p );
    }

    a.sort( );
    std::for_each( a.begin( ), a.end( ), print );

    std::cout << std::endl;

    a.sort( Reverse );
    std::for_each( a.begin( ), a.end( ), print );
}

std :: list提供链接列表特有的专用算法,例如拼接,排序和就地反转。

答案 3 :(得分:0)

我认为它应该是这样的:

static bool Sort(const Point& a, const Point& b) {
    return a.x<b.x;
}

不完全。见评论。

答案 4 :(得分:0)

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

struct Point
{
  int x, y;
};

bool PCompare(const struct Point& a, const struct Point& b) {

    if(a.y < b.y)
        return true;
    if(a.y > b.y)
        return false;
    return a.x<b.x;
}

int main(int argc, char *argv[])
{
  vector<Point> a;
  for (int i=0;i<10;i++) {
      Point p ;
    cin>>p.x>>p.y;
    a.push_back(p);
  }

  sort(a.begin(), a.end(), PCompare);
  system("PAUSE");
  return EXIT_SUCCESS;
}