2012-10-10 69 views
10

C++排序數組類C++類分揀陣列

我有一個陣列對象,記錄下列..

這是在classone.h

ClassOne 
{ 
string name; 
int data; 
float valueData; 
} 

和構造被創建at classone.cpp

在main.cpp中,我創建了ClassOne Array of Size 10

#include "classone.h" 

ClassOne cone[10]; 

接下來是我記錄的幾個值對象

現在ClassOne了3個對象

cone[0] 
name = "hello" 
data = 1 
valueData = 20 

cone[1] 
name = "panda" 
data = 2 
valueData = 15 

cone[2] 
name = "joe" 
data = 3 
valueData = 25 

我想要實現的是做一個排序,可以通過valueData重新排列數組最高的升序形式所以..它將是

cone[2]然後cone[0]然後cone[1] ..

,但如果我使用冒泡排序的問題,我想谷歌和找到一些,他們被e.g int a[]={9,6,5,23,2,6,2,7,1,8};

排序,但我通過類對象數組排序想。並重新安排價值,我如何實現這一目標。

所以,當我清點這將是

-- Highest to lowest -- 
1) Name: Joe , Data = 3, Value =25 
2) Name: Hello , Data =1 , Value = 20 
3) Name: Panda, Data = 2, Value = 15 

感謝所有幫助和指導!

+0

這麼多下來投票排序呢..我是新來的C++。並且不知道如何繼續。 –

回答

2

您必須爲您的班級定義比較運算符。如何確定一個對象是否小於另一個對象並不清楚你的問題。

17

最簡單的方法是使用標準庫:

#include <algorithm> 

std::sort(cone, cone + 10, 
      [](ClassOne const & a, ClassOne const & b) -> bool 
      { return a.value < b.value; }); 

如果你願意在全球範圍內定義一個比較操作符,你甚至不需要拉姆達:

bool operator<(ClassOne const & a, ClassOne const & b) 
{ 
    return a.value < b.value; 
} 

std::sort(cone, cone + 10); 

或者你可以讓比較器成爲一個成員函數。或者您可以給比較器函數一個自定義名稱並將其作爲sort的第三個參數傳遞。這可能是一個好主意的情況下比較具體到你的情況,而不是「自然」:

bool ValueCmp(ClassOne const & a, ClassOne const & b) 
{ 
    return a.value < b.value; 
} 

std::sort(cone, cone + 10, ValueCmp); 

如果你沒有C++ 11支持(lambda表達式的最後一個版本是有用的,如第一種情況),或者如果您想在多種不同情況下重新使用比較器。

+2

+1,請注意讀者 - lambdas的使用僅限於C++ 11。 –

+0

我不知道如何對我的對象應用排序..我試着你的例子,但有一些錯誤.. –

+0

@baokychen:我拼錯了類名。刷新頁面並重試。它應該工作。 –

6

使用std::sort和合適的排序函數/仿函數:

bool comp(const ClassOne& lhs, const ClassOne& rhs) 
{ 
    return lhs.valueData < rhs.valueData; 
} 

std::sort(cone, cone+10, comp); 

,或者在C++ 11,

std::sort(std::begin(cone), std::end(cone), comp); 
+0

我看到你的標準庫指南,我如何使用它與我的錐體對象? –

+0

@baokychen就像上面一樣。你沒有一個錐體對象,你有一個'ClassOne'對象的數組叫做'cone ??。 – juanchopanza

+0

爲了保持一致性和清晰度,我建議使用地址 - 運算符'&'來形成函數指針,而不是從函數到函數指針的隱式轉換。 –

3

看看你冒泡排序來源。在某些情況下,它將比較一個int與另一個,可能與小於運算符(<)或大於運算符(>)。這就是排序函數確定這兩個項目的相對順序的地方。通過多次重複該比較,排序功能能夠確定集合的總順序。

您需要用您自己的比較功能替換該操作。一個函數,它接受你的類的兩個對象,如果第一個被認爲小於第二個,則返回true;如果第二個被認爲小於第一個,則返回false;如果它們應該被認爲是等價的,則返回false。

5

您可以實現該std::sort<algorithm>頭用來迭代項目排序operator <方法的結構。

struct One { 
string name; 
int data; 
float valueData; 

bool operator < (const one &a) const{ 
return valueData <a.valueData; 
} 

}; 

那麼所有你所要做的就是讓這個結構數組,並使用排序功能對我的問題