2015-01-13 3 views
1

У меня есть много точек (a, b), и я сохранил координату x в координатах [] и y в b []. Теперь мне нужно отсортировать эти точки по координате x или y-координате. Я знаю, что в C++ существует концепция пар, но есть ли лучший способ сделать это. Пожалуйста, дайте ответы на C/C++.Любая альтернатива для пар?

+2

Я не могу представить себе лучший способ хранения пар двух целых чисел, то в структурах паров двух целых чисел. –

+0

Вы спрашиваете о C или C++ или хотите что-то, что работает в обоих? – immibis

+0

Вы можете создать пользовательский итератор для 'a', чтобы при его сортировке он также изменял порядок в' b', чтобы оставаться последовательным. –

ответ

5

Вы можете сохранить пару координат, используя std::pair<int, int>, или как ответ by @Gopi указывает на struct.

Коллекция любого из них может быть отсортирована по координате X или по координате Y с использованием лямбда-функции, функтора или глобальной функции.

// A vector of vertices. 
std::vector<std::pair<int, int>> vertices; 

// Sort the vertices by X coordinates using a lambda function to order them 
std::sort(vertices.begin(), vertices.end(), 
     [](auto const& a, auto const& b) { return a.first < b.first; }); 

// Sort the vertices by Y coordinates using a lambda function to order them 
std::sort(vertices.begin(), vertices.end(), 
      [](auto const& a, auto const& b) { return a.second < b.second; }); 
+0

'pair' уже имеет функцию сравнения , он сравнивает «first», и если они равны, он сравнивает «second», поэтому вам не нужно передавать лямбду на первый вид там. –

+0

@JonathanMee, правда. Если пользователь хочет сортировать их только по координате X и игнорировать координату Y, то функция сравнения необходима. –

4
struct vertex 
{ 
int x; 
int y; 
}; 

Затем сортировать конструкции соответствующим образом.

+0

Не могли бы вы рассказать о том, как отсортировать массив этих структур с помощью функции sort() C++ –

+2

@ user3901994 'std :: sort (std :: begin (an_array), std :: end (an_array), [] (vertex const & a, vertex const & b) {return ax cdhowie

+2

@cdhowie Я думаю, что это важно отметить, что ваш компартер использует функции лямбда и нуждается в компиляции флага C++ 11. – Mustafa

2

Вы можете использовать struct, как указано и показано в других ответах. Однако, если вы определяете свою собственную структуру, вам нужно будет определить функцию компаратора для использования с алгоритмом сортировки или перегрузить оператор <.

Преимущество использования std::pair состоит в том, что вам не нужно определять компаратор, потому что std::pair перегружает оператора < для сортировки по первому элементу сначала, затем по второму элементу. См. Этот пример answer.

+0

* «' std :: pair - то, что вам не нужно будет определять компаратор »* - это, безусловно, стоит упомянуть, но работает только для увеличения порядка' .first' ... –

0

Лучший способ - это как ответ от @Gopi. Для лексикографической сортировки вы можете использовать std :: tie (http://en.cppreference.com/w/cpp/utility/tuple/tie).

struct vertex 
{ 
    int x; 
    int y; 
    bool less_x(const struct vertex& b) const { return std::tie(x,y) < std::tie(b.x, b.y); } 
    bool less_y(const struct vertex& b) const { return std::tie(y,x) < std::tie(b.y, b.x); } 
}; 
0
int c = x*n + y where, n>x and n>y 

x=c/n 
y=c%n 

Когда вам нужно x просто c/n даст x и y использования c%n дает у.

Примечание: Работы для положительных координат только

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