Intereting Posts
Как привлечь внимание к связям / зависимостям C ++? Почему порядок битовых полей в байтах структур, не определенных самим языком? Почему неоднозначно вызывать перегруженные ambig (long) и ambig (unsigned long) с целым литералом? Производительность копирования файла с fread / fwrite на USB Выберите лучшую доступную функцию через наследование меток Количество файлов в каталоге с использованием C ++ Планарный чертеж YUV420 виртуальная функция, объявленная не виртуальной в производном classе Как правильно проверить, является ли std :: function пустым в C ++ 11? Как инициализировать переменную элемента управления classа? Доступ к защищенному члену classа в производном classе C ++ – самый быстрый способ очистки или стирания вектора Сборка релиза не работает при запуске без отладки в VS2010 Создайте «Добавить новый элемент» в Visual C ++ Как получить вектор комплексных чисел из двух векторов (real & imag)

STL устанавливает пользовательский вид

Я пытался прибегнуть к набору, когда понял, что невозможно прибегнуть к набору, и мне пришлось создать новый набор и иметь специальную функцию сортировки, чтобы использовать его . Я исследовал онлайн и пытался реализовать свою собственную функцию сортировки, но не уверен, как это сделать

Это мой class

class Point2D { public: int getX() const; int getY() const; void setX(int); void setY(int); bool operator < ( const Point2D& x2) const { if ( x != x2.x) { return x < x2.x; } if ( y != x2.y) { return y < x2.y; } }; protected: int x; int y; }; 

В настоящее время он сортируется в соответствии с значениями x, за которыми следуют значения y, я хочу использовать его в соответствии с

y, за которыми следуют значения x

поэтому я реализовал этот пользовательский вид

 bool p2d_sortby_y(Point2D& ptd1 , Point2D& ptd2) //custom sort function { if ( ptd1.getY() != ptd2.getY()) { return ptd1.getY() < ptd2.getY(); } if ( ptd1.getX() != ptd2.getX() ) { return ptd1.getX() < ptd2.getX(); } return false; } 

Это мой пример кода, как я пытаюсь использовать набор,

 #include  #include  #include  #include  #include  using namespace std; class Point2D { public: int getX() const; int getY() const; void setX(int); void setY(int); bool operator < ( const Point2D& x2) const { if ( x != x2.x) { return x < x2.x; } if ( y != x2.y) { return y < x2.y; } }; protected: int x; int y; }; bool p2d_sortby_y(Point2D& ptd1 , Point2D& ptd2) //custom sort function { if ( ptd1.getY() != ptd2.getY()) { return ptd1.getY() < ptd2.getY(); } if ( ptd1.getX() != ptd2.getX() ) { return ptd1.getX() < ptd2.getX(); } return false; } int main() { set p2d_set; Point2D p2d; p2d.setX(1); p2d.setY(3); p2d_set.insert(p2d); p2d.setX(3); p2d.setY(2); p2d_set.insert(p2d); set::iterator p2 = p2d_set.begin(); while ( p2 != p2d_set.end() ) { cout<getX() <<" " <getY() <<endl; p2++; } set p2d_set2 = p2d_set; // i am unsure of how to implement the custom sort function here } int Point2D::getX() const { return x; } int Point2D::getY() const { return y; } void Point2D::setX(int x1) { x = x1; } void Point2D::setY(int y1) { y = y1; ; } 

Может кто-нибудь мне помочь?

Это будет более простой способ сделать это:

 #include  struct SortByYX { bool operator ()(const Point2D& lhs, const Point2D& rhs) const { return std::tie(lhs.y, lhs.x) < std::tie(rhs.y, rhs.x); } }; 

затем

 set p2d_set2(p2d_set.begin(), p2d_set.end()); 

Изменить : std::tie требует поддержки C ++ 11, но если у вас ее нет, вы можете использовать std::tr1::tie из или boost::tie если у вас нет TR1 ,

В set второй параметр p2d_sortby_y не называет тип.

 struct point_odered_by_y { bool operator()(const Point2D& ptd1, const Point2D& ptd2) const { /* .. */ } }; typedef std::set pointset; pointset s(begin(p2d_set), end(p2d_set)); 

Обычно лучше определить class функтора, чтобы указать порядок, а не функцию; Таким образом, вы можете указать его как параметр шаблона:

 struct p2d_sortby_y { bool operator()(Point2D x, Point2D y) {return whatever;} }; 

Это должно принимать свои аргументы по значению или const ссылке (а не константной ссылке, как это делает ваш) для использования в константных элементах.

Вы не можете напрямую инициализировать новый набор из другого типа, но вы можете инициализировать его из своего диапазона:

 set p2d_set2(p2d_set.begin(), p2d_set.end()); 

Ваши два набора имеют разные типы (функция сравнения является частью определения типа).

Поскольку std::set не предоставляет конструктор или оператор присваивания для разных функций сравнения, вам нужно либо инициализировать новый набор с помощью пары iteratorов, либо ваш первый набор или std::copy над элементами.

То есть:

 set p2d_set2 { std::begin(p2d_set), std::end(p2d_set) }; 

или же

 set p2d_set2; std::copy(std::begin(p2d_set), std::end(p2d_set), std::inserter(p2d_set2));