2013-06-09 5 views
1

меня вектор, который содержит 4 элемента, которые не отсортированных, вектор выглядит следующим образом:сортировка более и более низкие значения в векторе

vector<positionInfo> objects 

где positionInfo является структурой:

struct positionInfo 
{ 
    int X_pos; 
    int Y_pos; 
} 

теперь эти 4 элемента не сортируются, но я хочу, чтобы они находились в определенном порядке:

  • Элемент 1 ([0]) должен иметь самый низкий Y и X поз.
  • Элемент 2 ([1]) должен иметь наивысшее значение X pos, но самое низкое значение Y pos.
  • Элемент 3 ([2]) должен иметь самые высокие значения Y и X поз.
  • Элемент 4 ([3]) должен иметь самый низкий X pos, но самый высокий Y pos.

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

+0

Ваш вопрос немного неоднозначен - что на самом деле означает наименьшее значение Y и X pos? (например, если у меня есть (1,10) и (7,2), каков ответ на самый низкий вопрос Y и X pos?) Может ли ответ быть точкой, которая не находится в вашем векторе, «объектах»? – kfmfe04

+0

Нет, только работая с 4 элементами, они решают, каковы самые младшие X и Y pos, которые, очевидно, где Y_pos и X_pos в структуре имеют самое низкое значение всех из 4. – user2373581

+0

, так что, если мои четыре входа (1,10), (7,2), (12,0), (10,1), что вы ожидаете от своих четырех ответов? – kfmfe04

ответ

2

Если вы полностью уверены, что у вас есть решение, вы можете частично использовать std::sort.

Для примера (3 шага):

перегрузки < Оператор:

bool 
operator < (const positionInfo & left, const positionInfo & right) 
{ 
    return left.X + left.Y < right.X + right.Y; 
} 

Следующая, сортировать ваш вектор:

std::sort(&objects[0], &objects[4]); 

Заметим, что в этом примере вектор имеет ровно 4 элемента ,

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

Последний шаг - своп INTERAL элементы, если это необходимо:

if (objects[1].X < objects[2].X) 
    std::swap(&objects[1], &objects[2]); 

Done.

0

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

I'l иллюстрируют это с изображением:

enter image description here

Учитывая только (1) и (2) или (3) и (4), что невозможно сказать, что должно быть больше:

Если (1) и (2) имели свои координаты y больше, чем (3) и (4), они заменяли бы свои позиции.

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

Таким образом, вы не можете использовать стандартные алгоритмы сортировки.

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

new_objects[0] = find_elememt_with_lowet_x_and_y(objects); 
new_objects[1] = find_element_with_highets_x_and_lowest_y(objects); 
//.... 
objects = new_objects; 
0

Несколько пунктов:

  • Четыре точки не образуют куб - он имеет 8 вершин. Если вы хотите определить куб, возможно, вам нужны 3 измерения. Я предполагаю, что вы говорите о квадрате
  • В случае, если вы на самом деле не имеете дело с квадратами, но со случайными 4 точками ваша сортировка нечеткая - например, Element 1 ([0]) must have the lowest Y and X pos не требуется иметь самые низкие y и x в той же точке.

Если, однако, вы имели в виду квадрат, а не куб и действительно уверены, что хотите иметь дело с этой ситуацией, вы можете сделать это следующим образом

  • цикла все четыре вершины
  • найти минимальный и максимальные x и y s
  • , потому что вы уверены в ситуации, с которой имеете дело, вы можете создать 4 точки интереса из этих 4 значений.
Смежные вопросы