簡體   English   中英

排序結構

[英]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::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 ++沒有提供任何方式將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM