我想知道我們是否可以對預先創建的集合進行排序。當我第一次創建集合s_p2時,我使用不同的元素point.getLength()進行排序。但在用戶輸入後,我想根據x值point.getX()對項目進行排序。我如何做到這一點?使用std排序集合:: sort
看起來像集容器沒有排序功能。我建議使用矢量。 但集只能存儲唯一的元素。
Q1:如果設置是無法做到這一點比STL容器是最好的選擇,我怎麼能在容器中的元素進行排序:我如何可以排序的一組取決於標準
Q2。
我想知道我們是否可以對預先創建的集合進行排序。當我第一次創建集合s_p2時,我使用不同的元素point.getLength()進行排序。但在用戶輸入後,我想根據x值point.getX()對項目進行排序。我如何做到這一點?使用std排序集合:: sort
看起來像集容器沒有排序功能。我建議使用矢量。 但集只能存儲唯一的元素。
Q1:如果設置是無法做到這一點比STL容器是最好的選擇,我怎麼能在容器中的元素進行排序:我如何可以排序的一組取決於標準
Q2。
你不能再打一個set
,如何排序是特定set
的類型的一部分。給定set
具有不可更改的固定設置順序。
您可以使用相對簡單的數據創建新的set
。只要創建一個新的set
根據新的標準進行排序。
如果要在相同的代碼中使用兩個set
s,則必須將訪問抽象爲基礎set
。
現在,如果您正在進行罕見的讀取和修改操作,那麼使用手動排序的vector
通常是一個更好的主意。您可以使用std::unique
- erase
慣用語刪除重複項。
std::set
以分類方式存儲其成員。如果您穿過從.begin()
到.end()
的集合,您將擁有一個排序的項目列表。
如果你不喜歡默認的排序標準,你可能會提供一個第二個模板參數std::set<>
是啊。我明白了。但我可以重新排序它 –
@ user1571494 - 不,您不能重新排序它。你*可以*將這些項目從std :: set <>'複製到另一個容器中 - 也許是一個帶有不同比較模板參數的'std :: set'。 –
我相信集接受一個比較器或一個對象(或者指向一個函數的指針或者一個帶有函數調用操作符的類),它能夠在集合中獲取兩個對象並確定它們之間的絕對順序。如果您查看本頁底部的示例:http://www.cplusplus.com/reference/stl/set/set/,則有一個使用自定義比較器的示例。 – Wug
您可以有兩組並使它們保持同步或將一個複製到另一個。
#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
矢量對我來說沒問題。但我不知道如何實現std :: unique-erase。你能建議嗎? –
@ user1571494:給定一個已排序的向量,'v.erase(std :: unique(v.begin(),v.end()),v.end());'將刪除重複項。 –
請注意,@Mike寫的上面的代碼將使用'operator =='來比較它們。您可能需要傳入一個謂詞,以便只對類別相同的東西進行核取'(!(a Yakk