事前に作成されたセットを並べ替えることができるかどうか知りたいのですが。最初にセットs_p2を作成するとき、別の要素point.getLength()を使用してソートします。しかし、ユーザー入力の後、x値point.getX()に従って項目をソートしたいと思います。どうやってこれを行うのですか?
セットコンテナにはソート機能がないようです。そして、私はベクトルを使用することをお勧めします。ただし、セットは一意の要素のみを保存できます。
Q1:基準に応じてセットを並べ替える方法
Q2:セットがこれを行うことができない場合、どのSTLコンテナーが最良の選択であり、どのようにしてコンテナー内の要素をソートできますか?.
set
を再ソートすることはできません。ソート方法は特定のset
のタイプの一部です。指定されたset
には、変更できない固定のセット順序があります。
同じデータで新しいset
を比較的簡単に作成できます。新しい基準に基づいてソートする新しいset
を作成するだけです。
同じコードで2つのset
sを使用する場合は、基になるset
へのアクセスを抽象化する必要があります。
さて、まれな読み取りや変更を行う場合は、手動で並べ替えるvector
を使用することをお勧めします。 std::unique
-erase
イディオムを使用すると、重複を削除できます。
_std::set
_は、メンバーをソートされた方法で格納します。 .begin()
から.end()
までのセットをウォークスルーすると、並べ替えられたアイテムのリストが表示されます。
デフォルトのソート基準が気に入らない場合は、2番目のテンプレートパラメータを_std::set<>
_に指定できます。
2つのセットを用意して、同期を保つか、一方をもう一方にコピーできます。
#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