2016-09-04 5 views
-4

Я пытаюсь сортировать массив объектов с использованием зЬй :: сортировки -с использованием C++ станд :: сортировать с лямбда-компаратора

sort(convexHull.getSet(), convexHull.getSet()+convexHull.size(), 
    [](const Point & a, const Point & b) -> bool 
    {    if (a.getX() < b.getX()) 
     return true; 
    else if (a.getX() == b.getX()) 
     return a.getY() < b.getY(); 
    else 
     return false;; } 
); 

где convexHull.getSet() возвращает указатель на начало массива ,

как описано here.

Но я получаю очень долго ошибку от моего компилятора (Clion), что-то о моем операторе присваивания -

#include <cmath> 
#include <string> 

using namespace std; 

class Point 
{ 

private: 
    int _x; 
    int _y; 
    double _arg; 

    void setArg() 
    {   
     if(sqrt(_x*_x + _y*_y) == 0) 
      _arg = 5; 
     else 
      _arg = _y/sqrt(_x*_x + _y*_y); 
    } 

public: 
    Point() : Point(0, 0) {} 

Point (const int x, const int y) : _x(x), _y(y) 
{ 
    setArg(); 
} 

int getX() const 
{ return _x; } 

int getY() const 
{ return _y; } 


    ~Point() {} 

    Point& operator= (const Point &rval); 
}; 

(где setArg просто вычисляет угол точки с положительной оси х).

я опробованный оператора с помощью этого кода -

Point p(5,5); 
Point t(3,3); 
t=p; 
t.setXY(7,7); 

и это, кажется, работает нормально.

это очень долго, так что я выложу только его часть -

In file included from /usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/algorithm:62:0, 
       from /cygdrive/c/Users/o/Desktop/CPP/ex1/cppex1/ex1/ConvexHull.cpp:7: 
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/bits/stl_algo.h: In instantiation of 'void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = const Point*; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<main()::<lambda(const Point&, const Point&)> >]': 
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/bits/stl_algo.h:1880:25: required from 'void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = const Point*; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<main()::<lambda(const Point&, const Point&)> >]' 
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/bits/stl_algo.h:1966:31: required from 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = const Point*; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<main()::<lambda(const Point&, const Point&)> >]' 
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/bits/stl_algo.h:4729:18: required from 'void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = const Point*; _Compare = main()::<lambda(const Point&, const Point&)>]' 
/cygdrive/c/Users/o/Desktop/CPP/ex1/cppex1/ex1/ConvexHull.cpp:75:5: required from here 
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/bits/stl_algo.h:1847:17: error: passing 'const Point' as 'this' argument discards qualifiers [-fpermissive] 
     *__first = _GLIBCXX_MOVE(__val); 
       ^
In file included from /cygdrive/c/Users/o/Desktop/CPP/ex1/cppex1/ex1/PointSet.h:9:0, 
       from /cygdrive/c/Users/o/Desktop/CPP/ex1/cppex1/ex1/ConvexHull.cpp:4: 
/cygdrive/c/Users/o/Desktop/CPP/ex1/cppex1/ex1/Point.h:45:12: note: in call to 'Point& Point::operator=(const Point&)' 

это также может иметь отношение -

/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/bits/predefined_ops.h:123:46: note: candidate: bool (*)(Point&, Point&) <conversion> 
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/bits/predefined_ops.h:123:46: note: conversion of argument 3 would be ill-formed: 
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/bits/predefined_ops.h:123:46: error: binding 'const Point' to reference of type 'Point&' discards qualifiers 
/cygdrive/c/Users/o/Desktop/CPP/ex1/cppex1/ex1/ConvexHull.cpp:68:38: note: candidate: main()::<lambda(Point&, Point&)> <near match> 
      [](Point & a, Point & b) -> bool 
+3

'Point & Point :: operator = (const Point & rval)' вероятно, исправит это. –

+0

Вы компилятор GCC, CLion - это просто IDE –

+0

@ πάνταῥεῖ это не так, я отредактирую – proton

ответ

1

Видимо проблема не в сравнении, а в том, что вы перейдя к std::sort. Что такое декларация для

convexHull.getSet() 

?

Если это, например, возвращает const Point *, тогда у вас есть проблема с корректностью констант, потому что std::sort должен уметь писать для переупорядочения элементов.

+0

полностью согласен с вашим анализом (с заявлениями OP, все работает: https://ideone.com/J6TDhU)!Но разве это не комментарий скорее о неполном вопросе, чем окончательный ответ? – Christophe

+0

Кажется, проблема problemm, я изменил подпись getSet(), чтобы вернуть указатель не const, и теперь мой код компилируется. – proton

Смежные вопросы