Если я определяю структуру
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.
Чтобы отсортировать структуру данных с помощью алгоритма 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()
.
std::begin(array)
и std::end(array)
. До C ++ 11, конечно, каждый профессиональный программист имел что-то эквивалентное в своем наборе инструментов и использовал его.
Нет, это не сработает, как написано.
Первый 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
не будут модифицированы в определенном объекте, но расположение этого объекта в отсортированном массиве может иметь другой индекс.
Для начала, 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 );
}
Но это было бы очень странно, и я бы предложил найти другой способ организации ваших данных.
Если вы хотите отсортировать массив структур в соответствии со значением 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
.
b
. std::sort
требуется для использования swap
он находит с помощью ADL. (Однако я настоятельно рекомендую против этого. swap
который не поменяется, может запутать программистов обслуживания).