排序结构(ures)

时间:2013-12-03 18:35:56

标签: c++ sorting

如果我定义一个结构

struct dat{
    int a;
    char b;
};

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

dat array[10];

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

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

这会有用吗?

并且假设在排序之后,数组[5] .a转到数组[2] .a,数组[5] .b也转到数组[2] .b,如果不是如何使用std库函数执行此操作排序

4 个答案:

答案 0 :(得分: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()调用中的过去最后一个元素时重复它。

答案 1 :(得分: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::adat::b将不会在特定对象中进行修改,但该对象在已排序数组中的位置可能位于不同的索引处。

答案 2 :(得分: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的数组。

答案 3 :(得分:0)

对于初学者来说,array.a不是法律用语,因为array 没有a成员,事实上,甚至不是结构。 如果您想按字段data成员进行排序,则需要 要么提供自定义订购功能(首选方式, 特别是如果你有C ++ 11并且可以使用lambda函数),或者 在operator<上定义dat。如果你只是想移动 排序期间a个成员,b成员离开他们 是......您还必须定义自定义swap功能:

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

但这会非常奇怪,我建议找一些其他的 组织数据的方式。