2013-12-03 60 views
0

如果我定義一個結構排序結構(URES)

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

爲什麼不看看http://www.cplusplus.com/reference/algorithm/sort/?你在那裏解釋瞭如何對自己的結構進行排序。關於問題「這項工作」,我認爲你可以自己檢查一下。 – gregory561

+0

我懷疑你需要添加一個自定義比較函數,以便std :: sort知道如何比較dat結構。你當然不能說array.a – pm100

+0

沒有「整數數組」。有一個* dat *數組, – WhozCraig

回答

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()的過程中引用過去最後一個元素時重複它。

+2

爲了避免幻數:在C++ 11中,有'std :: begin (數組)'和'std :: end(數組)'。 Pre-C++ 11,當然,每個專業程序員在他們的工具包中都有相同的東西,並使用它。 –

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將不會在特定對象內被修改,但該對象在已排序數組中的位置可能在不同的索引處。

+0

我不確定這是什麼意思 –

+0

究竟是什麼讓人困惑? – Chad

0

如果你想根據a價值結構數組排序:

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

這將與其對應的a的價值觀,我認爲這是你說你要沿着移動b值。如果你想讓b的值保持原來的位置,那麼它會變得更加混亂。 C++不提供任何方式將dat的數組作爲int的數組處理。

+0

你可以提供一個自定義的交換,忽略'b'成員。需要'std :: sort'來使用ADL發現的'swap'。 (然而,我強烈建議不要這樣做,一個不交換的'swap'會讓維護程序員感到困惑不已。) –

0

對於初學者來說,array.a是不是合法的表達,因爲array 不具有a成員,而事實上,甚至不是一個結構。 如果你想通過現場adat成員排序,你需要 要麼提供自定義排序功能(首選方法,尤其是 如果你有C++ 11,並且可以使用lambda函數),或 定義operator<dat。如果你只是想排序過程中對 a成員移動,離開b成員,他們 是......你必須定義一個定製swap功能以及:

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

但是,這將是非常更奇怪了,我建議找一些其他的組織你的數據的方式。