如果我定义一个结构
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库函数执行此操作排序
答案 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::a
和dat::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
成员,事实上,甚至不是结构。
如果您想按字段dat
对a
成员进行排序,则需要
要么提供自定义订购功能(首选方式,
特别是如果你有C ++ 11并且可以使用lambda函数),或者
在operator<
上定义dat
。如果你只是想移动
排序期间a
个成员,b
成员离开他们
是......您还必须定义自定义swap
功能:
void
swap( dat& lhs, dat& rhs )
{
std::swap( lhs.a, rhs.a );
}
但这会非常奇怪,我建议找一些其他的 组织数据的方式。