2012-11-14 70 views
9

我想知道我們是否可以對預先創建的集合進行排序。當我第一次創建集合s_p2時,我使用不同的元素point.getLength()進行排序。但在用戶輸入後,我想根據x值point.getX()對項目進行排序。我如何做到這一點?使用std排序集合:: sort

看起來像集容器沒有排序功能。我建議使用矢量。 但集只能存儲唯一的元素。

Q1:如果設置是無法做到這一點比STL容器是最好的選擇,我怎麼能在容器中的元素進行排序:我如何可以排序的一組取決於標準

Q2。

回答

11

你不能再打一個set,如何排序是特定set的類型的一部分。給定set具有不可更改的固定設置順序。

您可以使用相對簡單的數據創建新的set。只要創建一個新的set根據新的標準進行排序。

如果要在相同的代碼中使用兩個set s,則必須將訪問抽象爲基礎set

現在,如果您正在進行罕見的讀取和修改操作,那麼使用手動排序的vector通常是一個更好的主意。您可以使用std::unique - erase慣用語刪除重複項。

+0

矢量對我來說沒問題。但我不知道如何實現std :: unique-erase。你能建議嗎? –

+2

@ user1571494:給定一個已排序的向量,'v.erase(std :: unique(v.begin(),v.end()),v.end());'將刪除重複項。 –

+3

請注意,@Mike寫的上面的代碼將使用'operator =='來比較它們。您可能需要傳入一個謂詞,以便只對類別相同的東西進行核取'(!(a Yakk

7

std::set以分類方式存儲其成員。如果您穿過從.begin().end()的集合,您將擁有一個排序的項目列表。

如果你不喜歡默認的排序標準,你可能會提供一個第二個模板參數std::set<>

+0

是啊。我明白了。但我可以重新排序它 –

+0

@ user1571494 - 不,您不能重新排序它。你*可以*將這些項目從std :: set <>'複製到另一個容器中 - 也許是一個帶有不同比較模板參數的'std :: set'。 –

+0

我相信集接受一個比較器或一個對象(或者指向一個函數的指針或者一個帶有函數調用操作符的類),它能夠在集合中獲取兩個對象並確定它們之間的絕對順序。如果您查看本頁底部的示例:http://www.cplusplus.com/reference/stl/set/set/,則有一個使用自定義比較器的示例。 – Wug

3

您可以有兩組並使它們保持同步或將一個複製到另一個。

#include <iostream> 
#include <set> 

using namespace std; 

struct AB 
{ 
    AB(int a,int b) : _a(a),_b(b) {} 

    int _a; 
    int _b; 
}; 

struct byA 
{ 
    bool operator() (const AB& lhs, const AB& rhs) 
    { 
      return lhs._a <= rhs._a; 
    } 
}; 

struct byB 
{ 
    bool operator() (const AB& lhs, const AB& rhs) 
    { 
     return lhs._b <= rhs._b; 
    } 
}; 

typedef set<AB,byA> ByA; 
typedef set<AB,byB> ByB; 
typedef ByA::const_iterator ByAIt; 
typedef ByB::const_iterator ByBIt; 

void getByB(const ByA &sA,ByB &sB) 
{ 
    for(ByAIt iter=sA.begin(); iter!=sA.end();++iter) { 
     const AB &ab=*iter; 
     sB.insert(ab); 
    } 
} 

int main(int argc, const char **argv) 
{ 
    ByA sA; 
    sA.insert(AB(3,6)); 
    sA.insert(AB(1,8)); 
    sA.insert(AB(2,7)); 

    ByB sB; 
    getByB(sA,sB); 

    cout << "ByA:" << endl; 
    for(ByAIt iter=sA.begin(); iter!=sA.end();++iter) { 
     const AB &ab=*iter; 
     cout << ab._a << "," << ab._b << " "; 
    } 
    cout << endl << endl; 

    cout << "ByB:" << endl; 
    for(ByBIt iter=sB.begin(); iter!=sB.end();++iter) { 
     const AB &ab=*iter; 
     cout << ab._a << "," << ab._b << " "; 
    } 
    cout << endl; 
    return 0; 
} 

程序返回: BYA 1,8 2,7 3,6

BYB: 3,6 2,7 1,8