[英]Sorting struct(ures)
如果我定義一個結構
struct dat{
int a;
char b;
};
然后我聲明該結構的數組,即
dat array[10];
然后我排序數據數組array [i] .a,即
std::sort((array.a),(array.a+10);
這會工作嗎?
並假設排序后,array [5] .a轉到array [2] .a,array [5] .b也會轉到array [2] .b,如果不是的話,如何使用std庫函數sort做到這一點。
要使用std::sort()
算法對數據結構進行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::a
和dat::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 ++沒有提供任何方式將dat
數組視為int
數組。
對於初學者來說, array.a
是不是一個合法的表達,由於array
不具有a
部件,而事實上,甚至不是一個結構。 如果要按字段a
排序dat
成員,則需要提供自定義排序功能(首選方式,尤其是如果您具有C ++ 11並可以使用lambda函數),或在dat
上定義operator<
。 如果只想在排序過程中移動a
成員,而將b
成員留在b
...則還必須定義一個自定義swap
函數:
void
swap( dat& lhs, dat& rhs )
{
std::swap( lhs.a, rhs.a );
}
但這會很奇怪,我建議您找到其他方式來組織數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.