Сортировка структуры (руд)

0

Если я определяю структуру

struct dat{
    int a;
    char b;
};

и затем объявляю массив этой структуры, т.е.

dat array[10];

и затем я сортирую массив массивов данных [i].a, т.е.

std::sort((array.a),(array.a+10);

будет ли это работать?

И предположим, что после сортировки массив [5].a переходит к массиву [2].a, массив [5].b также переходит к массиву [2].b, если не так, как это сделать, используя сортировку функции std.

  • 0
    Почему бы не взглянуть на cplusplus.com/reference/algorithm/sort ? Вы там объяснили, как сортировать свои собственные структуры. Что касается вопроса "будет ли это работать", я думаю, что вы можете проверить это самостоятельно.
  • 0
    я подозреваю, что вам нужно добавить пользовательскую функцию компаратора, чтобы std :: sort знал, как сравнивать структуры данных. Вы, конечно, не можете сказать, массив.
Показать ещё 1 комментарий
Теги:
sorting

4 ответа

2
Лучший ответ

Чтобы отсортировать структуру данных с помощью алгоритма std::sort(), вы можете предоставить функцию компаратора в качестве третьего аргумента.

Например, для сортировки значений dat.a:

bool IntSorter (const dat& dat1, const dat& dat2) { return dat1.a < dat2.a; }

Затем вы вызываете следующее:

std::sort(array, array + 10, IntSorter);

Кроме того, вы можете реорганизовать свой код, чтобы избежать волшебного номера 10, а также избегать дублирования его при обращении к элементу последнего прошлого в вызове std::sort().

  • 2
    Чтобы избежать магического числа: в C ++ 11 есть std::begin(array) и std::end(array) . До C ++ 11, конечно, каждый профессиональный программист имел что-то эквивалентное в своем наборе инструментов и использовал его.
1

Нет, это не сработает, как написано.

Первый std::sort((array.a),(array.a+10); неверен. array.a не является массивом и пытается рассматривать его как один, безусловно, приведет к некоторым проблемам.

Вам нужно будет вместо этого отсортировать массив (std::sort(array, array+10);), но опять же, это не сработает, потому что вы не обеспечиваете перегрузку opeartor<(dat).

Вы можете предоставить один:

bool operator<(const dat& l, const dat& r)
{
   return l.a < r.a;
}

Затем std::sort(array, array+10); будет работать должным образом.

Когда вы сортируете объект, он "все идет вместе". Это означает, что dat::a и dat::b не будут модифицированы в определенном объекте, но расположение этого объекта в отсортированном массиве может иметь другой индекс.

  • 0
    Я не уверен что это значит
  • 0
    Что именно сбивает с толку?
0

Для начала, array.a не является юридическим выражением, так как array не имеет a член, а на самом деле, это даже не структура. Если вы хотите сортировать dat членов по полю a, вам нужно либо предоставить пользовательскую функцию заказа (предпочтительный способ, особенно если у вас есть С++ 11 и можете использовать лямбда-функции), либо определить operator< on dat, Если вы просто хотите, чтобы переместить член во время сортировки, оставляя a b член, где они... вы должны определить пользовательский swap функцию, а также:

void
swap( dat& lhs, dat& rhs )
{
    std::swap( lhs.a, rhs.a );
}

Но это было бы очень странно, и я бы предложил найти другой способ организации ваших данных.

0

Если вы хотите отсортировать массив структур в соответствии со значением a:

std::sort(std::begin(array), std::end(array), 
          [](dat const & lhs, dat const & rhs){return lhs.a < rhs.a;});

Это переместит b значения вместе с соответствующими им ценности, которые я думаю, что вы говорите, что вы хотите. a Если вы хотите, чтобы значения b оставались там, где они есть, это было бы несколько более беспорядочно. C++ не предоставляет никакого способа обработки массива dat как массива int.

  • 0
    Вы можете предоставить пользовательский своп, который игнорирует элементы b . std::sort требуется для использования swap он находит с помощью ADL. (Однако я настоятельно рекомендую против этого. swap который не поменяется, может запутать программистов обслуживания).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню