2014-05-22 56 views
1

我有一個結構列表,其中顯示了不同的數據類型。將結構列表排序兩次C++

struct sample 
{ 
    int nVal; 
    string strVal; 
    string strName;   
}; 

我們梳理該名單accorsing到NVAL,我用

bool sortList(const sample& a, const sample& b) // comparison function 
{ 
    return a.nVal< b.nVal; 
} 
std::sort(sample.begin(), sample.end(), sortList); 

現在,我的要求是排序相同的列表按照該結構中的字符串值,但它不應該影響到第一揀選,這是關於int值的。請建議我採取一種方法來實現結構的優化,而不影響以前的分類。 在此先感謝。

+2

請注意,如果您需要等於元素的順序被保存下來,然後使用std :: stable_sort代替std :: sort – amdn

+0

當你說按「結構中的字符串值」進行排序時,是否包含'strVal'和'strName'或只是'strVal'? – Ryan

回答

0

您想先按nVal排序,但如果元素具有相同的nVal,則按字符串排序。

一個簡單易懂的替代juanchopanza的答案,支持預C++ 11個編譯如下:

bool sortList(const sample& a, const sample& b) // comparison function 
{ 
    if (a.nVal == b.nVal) 
    { 
     if (a.strVal == b.a.strVal) 
     { 
      return a.strName < b.strName; 
     } 
     else 
     { 
      return a.strVal < b.strVal; 
     } 
    } 
    else 
    { 
     return a.nVal < b.nVal; 
    } 
} 
8

只需按照兩個標準進行排序即可。可以通過實施逐一比較實現這一點,使用nVal第一,其次是strVal,和strName

#include <tuple> // std::tie 

bool sortList(const sample& a, const sample& b) // comparison function 
{ 
    return std::tie(a.nVal, a.strVal, a.strName) < 
      std::tie(b.nVal, b.strVal, b.strName); 
} 

當與排序算法如std::sortstd::stable_sort使用的,這將導致基於nVal分揀首先,然後strVal,然後strName。採用std::tie只是簡化逐一比較的實現手段,但你可以自己動手完成它(這是既繁瑣且容易出錯。)

注意如果你想保持原來的排序根據比較標準認爲等同的要素,請使用std::stable_sort。否則,請使用std::sort

+0

+1但爲什麼沒有提到'std :: stable_sort'? –

+0

@KonradRudolph我加了'sort'和'stable_sort'的鏈接。我試圖找出OP的需求。 – juanchopanza

+0

(現在值得一提的是,'stable_sort'不需要你編寫你的比較函數。) –