Как отсортировать оба массива членов класса в показанном коде - PullRequest
1 голос
/ 15 сентября 2011

У меня есть простой код C ++, написанный для понимания использования функции сортировки в пользовательских типах данных классов для сортировки членов данных класса.

Но это только сортировка массива переменной b в классе.Потому что ранее отсортированный массив переменной a также нарушается при сортировке b.

#include <iostream>
#include <cstring>
using namespace std;

class Entry
{
public:
int a, b;
};

bool compare1(Entry e1, Entry e2)
{

if (e1. a > e2. a) return false;
return true;

}

bool compare2( Entry e1,  Entry e2)
{

if (e1. b > e2. b) return false;
return true;

}

int main()
{
int i;



vector<Entry> array(4);
array[0]. a =5 , array[0]. b =8 ;
array[1]. a =10 , array[1]. b =4 ;
array[2]. a =3 , array[2]. b =2 ;
array[3]. a =1 , array[3]. b =12 ;



sort(array.begin(), array.end(), compare1);
sort(array.begin(), array.end(), compare2);



cout << "sorted:" << endl;
for (i = 0; i< 4; i++)
cout << array[i]. a << " " << array[i].b << endl;

}

Вывод, который я получаю, выглядит следующим образом:

sorted:
3 2
10 4
5 8
1 12

Как отсортировать оба массива элементов данных - a, b?

Ответы [ 3 ]

3 голосов
/ 15 сентября 2011

Это зависит от того, как вы хотите, чтобы ваши элементы были отсортированы:

  1. Сортировка в виде пар, включенных a: (1,12), (3,2), (5,8), (10,4)

  2. Сортировка в виде пар, набранных на b: (3,2), (10,4), ...

  3. Сортировка по парам лексикографически: аналогично сортировке по a, поскольку для a.

В случае (1) вы используете compare1, в случае (2) вы используете compare2. (Для случая (3) вам придется написать другой предикат или просто использовать std::pair<int,int>.)


Случай 4: Если вы хотите, чтобы значения a и b сортировались отдельно и уничтожали спаривание, то вам нужно поместить значения в отдельные векторы чисел и отсортировать их по отдельности:

std::vector<int> avals(array.size()), bvals(array.size());

for (size_t i = 0; i != array.size(); ++i)
{
  avals[i] = array[i].a;
  bvals[i] = array[i].b;
}

std::sort(avals.begin(), avals.end());
std::sort(bvals.begin(), bvals.end());

Нет никакого способа обойти это. Контейнер с Entry объектами может перемещать только элементы целиком.

1 голос
/ 15 сентября 2011

Я думаю, вы путаете то, что делает sort. Он не прерывает члены , которые вы используете в функции сравнения, а целые объекты. В вашем случае это означает, что, поскольку вы инициализировали один объект с парой значений (5,8), в векторе всегда будет элемент (5,8).

Сортировка массива по первому члену означает, что он перемещается со второй на последнюю позицию (5 - второй по последнему по величине первый элемент), а сортировка по второму элементу приведет к перемещению объекта, хорошо в этом случае также от второй до последней позиции, но это будет только перемещение объекта в контейнере, это всегда будет (5,8).

0 голосов
/ 15 сентября 2011

Если вы хотите, чтобы оба влияли на сравнение, включите оба в функцию проверки (т.е. compare). Иначе, это либо один, либо другой. Если вам нужны разные «представления», вам нужен более умный контейнер (например, boost :: multi_index)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...