如果我定義一個結構排序結構(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庫功能排序。
如果我定義一個結構排序結構(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庫功能排序。
要使用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()
的過程中引用過去最後一個元素時重複它。
爲了避免幻數:在C++ 11中,有'std :: begin (數組)'和'std :: end(數組)'。 Pre-C++ 11,當然,每個專業程序員在他們的工具包中都有相同的東西,並使用它。 –
不,它不會像書面那樣工作。
第一個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
將不會在特定對象內被修改,但該對象在已排序數組中的位置可能在不同的索引處。
我不確定這是什麼意思 –
究竟是什麼讓人困惑? – Chad
如果你想根據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
的數組處理。
你可以提供一個自定義的交換,忽略'b'成員。需要'std :: sort'來使用ADL發現的'swap'。 (然而,我強烈建議不要這樣做,一個不交換的'swap'會讓維護程序員感到困惑不已。) –
對於初學者來說,array.a
是不是合法的表達,因爲array
不具有a
成員,而事實上,甚至不是一個結構。 如果你想通過現場a
到dat
成員排序,你需要 要麼提供自定義排序功能(首選方法,尤其是 如果你有C++ 11,並且可以使用lambda函數),或 定義operator<
在dat
。如果你只是想排序過程中對 a
成員移動,離開b
成員,他們 是......你必須定義一個定製swap
功能以及:
void
swap(dat& lhs, dat& rhs)
{
std::swap(lhs.a, rhs.a);
}
但是,這將是非常更奇怪了,我建議找一些其他的組織你的數據的方式。
爲什麼不看看http://www.cplusplus.com/reference/algorithm/sort/?你在那裏解釋瞭如何對自己的結構進行排序。關於問題「這項工作」,我認爲你可以自己檢查一下。 – gregory561
我懷疑你需要添加一個自定義比較函數,以便std :: sort知道如何比較dat結構。你當然不能說array.a – pm100
沒有「整數數組」。有一個* dat *數組, – WhozCraig