2010-12-30 10 views
0

stl :: setを使用して、要素が挿入されたときにソートされた状態に保ちます。私の質問は、ランダムアクセスについてです。複雑なクラス(例えばinitなど)が難しい場合は、クラスを作成する際に演算子を少なく定義するため、挿入が簡単です。しかし、キーがクラスそのものであれば、どのようにクラスにアクセスする必要がありますか? find()を使って?クラスを見つけるために複雑なクラスを初期化する必要がありますか?stl :: setのランダムアクセスと更新

私の質問は、どのように要素が複雑なクラスを初期化するのが難しい場合にランダムにアクセスする方法ですか?

ありがとう

+0

コンパレータを独自のクラス用に作成し、そのコンパレータを使用する必要があります。 – DumbCoder

+3

'std :: set'はランダムアクセスを提供しません。 – dalle

+1

達成しようとしていることに関する詳細情報を提供する必要があります。あなたがしようとしていることに応じて、操作の最後にコンテンツを並べ替えるほうが効率的です。詳細情報が必要です。 –

答えて

2

私はそれが可能だとは思いません。

オブジェクトが高価な場合は、std::map(ソートされたコンテナでもあります)を使用してください。可能であれば、値が(スマートな)ポインターである可能性があります。

2

セットはランダムアクセスイテレータをサポートしていません。あなたがオブジェクトを比較するために、他の方法をしたい場合は、

1)第一の方法

bool compareFunciton(const setElementClass& lhs,const setElementClass& rhs) 
{ 
    //return true if lhs's key is smaller than rhs and false at other case 
} 


set<setElementClass,compareFunction> someSet; 

2)次の操作を行う必要があります(演算子<を使用しません)それとも、この

のように機能するのではなく、機能クラスを使用することができます
class compareClass 
{ 
public: 
    bool opreator()const setElementClass& lhs,const setElementClass& rhs) 
    { 
      //return true if lhs's key is smaller than rhs and false at other case 
    } 
}; 

compaerClass comp; 
set<setElementClass,comp> someSet; 

また、機能ヘッダーを確認する必要があります。そこには、あなたがfeautureで使用できるいくつかの機能クラスがあります。あなたはすでに気づいて、std::set<>::findメンバ関数は期待し(std::setvalue_typeに同じである、)const key_type &http://www.cplusplus.com/reference/std/functional/

1

セットを使用する必要がありますか?

マップを使用して、複雑なクラスのキー(多分数値インデックスまたは文字列)を生成し、複合クラスのオブジェクトを値として使用する方がよい場合があります。

キーが値と同じ発注規則に従っていることを確認してください。 std :: mapはツリーとして実装されているので、キーに従ってソートされたアイテムも保持されます。

1

あなたが唯一のこのような小さい構造体を定義する必要があります。

#include <set> 

using std::binary_function; 
using std::set; 


struct very_complex 
{ 
    int x, y; 
}; 

struct less : public binary_function<very_complex, very_complex, bool> 
{ 
    bool operator() (very_complex const& lho, very_complex const& rho) 
    { 
     if (lho.x != rho.x) 
      return lho.x < rho.x; 
     return lho.y < rho.y; 
    } 
} 
3

次のことができます。

1)あなたのオブジェクトの「ligtweight」バージョンを作成するためにあなたのクラスのための特別な「lightweigt」初期化子を作成そのような「軽量」オブジェクトをキーとしてのみ使用すると、地図にアクセスすることができます。

2)セットではなくマップを使用します。

私は2番目の解決策を希望します。