对结构进行排序

Sorting struct(ures)

本文关键字:排序 结构      更新时间:2023-10-16

如果我定义一个结构

struct dat{
    int a;
    char b;
};

然后我声明该结构的数组,即

dat array[10];

然后我对dat数组数组[I].a进行排序,即

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

这行得通吗?

假设排序后,array[5].a转到array[2].a,array[5]。b也转到array[2]。b,如果不是如何使用std库函数sort.

p>要使用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::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::adat::b不会在特定对象内被修改,但该对象在排序数组中的位置可能在不同的索引处。

如果要根据a:的值对结构数组进行排序

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

这将移动b值及其相应的a值,我认为这正是您所希望的。如果您希望b值保持不变,那么它会有点混乱。C++没有提供任何将CCD_ 16的数组作为CCD_。

首先,array.a不是一个合法的表达式,因为array没有a成员,事实上,它甚至不是一个结构。如果要按字段adat成员进行排序,则需要以提供定制订购功能(优选方式,特别是如果你有C++11并且可以使用lambda函数),或者在CCD_ 24上定义一个CCD_。如果你只是想移动排序期间的a成员,将b成员留在其所在位置是您还必须定义一个自定义的swap函数:

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

但这会很糟糕,我建议找其他的组织数据的方式。