web-dev-qa-db-ja.com

std :: sortを使用したセットのソート

事前に作成されたセットを並べ替えることができるかどうか知りたいのですが。最初にセットs_p2を作成するとき、別の要素point.getLength()を使用してソートします。しかし、ユーザー入力の後、x値point.getX()に従って項目をソートしたいと思います。どうやってこれを行うのですか?

セットコンテナにはソート機能がないようです。そして、私はベクトルを使用することをお勧めします。ただし、セットは一意の要素のみを保存できます。

Q1:基準に応じてセットを並べ替える方法

Q2:セットがこれを行うことができない場合、どのSTLコンテナーが最良の選択であり、どのようにしてコンテナー内の要素をソートできますか?.

11
M.A

setを再ソートすることはできません。ソート方法は特定のsetのタイプの一部です。指定されたsetには、変更できない固定のセット順序があります。

同じデータで新しいsetを比較的簡単に作成できます。新しい基準に基づいてソートする新しいsetを作成するだけです。

同じコードで2つのsetsを使用する場合は、基になるsetへのアクセスを抽象化する必要があります。

さて、まれな読み取りや変更を行う場合は、手動で並べ替えるvectorを使用することをお勧めします。 std::unique-eraseイディオムを使用すると、重複を削除できます。

_std::set_は、メンバーをソートされた方法で格納します。 .begin()から.end()までのセットをウォークスルーすると、並べ替えられたアイテムのリストが表示されます。

デフォルトのソート基準が気に入らない場合は、2番目のテンプレートパラメータを_std::set<>_に指定できます。

7
Robᵩ

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

3
edW