2

私のプログラムはペアのセットに基づいています。

typedef std::pair<int,int> innerPair;
typedef std::pair<innerPair,int> setElement;
std::set<setElement> Foo;

innerPair要素は setElement を実際に定義するものですが、すべての要素にグループ ID を添付する必要があるため、後者の定義setElementです。

プログラムの残りの部分ではinnerPair、グループ ID に関係なく検索する必要があるため、基本的に関数が必要です。

std::set<setElement>::iterator find(innePair);

グループ ID に関係なく、innerPair を見つけます。現状では、使用可能なすべてのグループ ID を循環して複数回の find() 呼び出しを実行できますが、効率的とは言えません。

find( ... )ある種のワイルドカード検索を実行するメンバー関数を定義する簡潔な方法はありますか?それとも独自の定義でオーバーロードする必要がありますか?

4

5 に答える 5

3

同じ内部ペアと異なるグループIDを持つ複数の要素がある場合は、を使用できますstd::multimap<innerPair, int>

これにより、同じで複数の要素を保存できますinnerPair

lower_bound/upper_boundまた、またはでの検索も簡単になりequal_rangeます。

于 2012-11-25T22:05:57.807 に答える
2

これには 2 つの可能な設計が考えられます。一方が他方よりも適切な場合があります。

innerPair3 つのメンバー (1 番目、2 番目、およびグループ ID) を持つ構造体またはstd::tuple<int, int, int>. グループ ID はinnerPairオブジェクトの一部ですか? もしそうなら、私はこれがより良いデザインであることをお勧めします.

そうでない場合 (正直なところ、あなたの状況ではそうではないと思います)、 を使用して、オブジェクトからグループ ID へstd::map<innerPair,int>のマッピングを作成する必要があります。innerPair次に、次の方法で要素を簡単に見つけることができます。

std::map<innerPair,int> mapping;
// Fill your map
innerPair key = {1, 2};
auto found_iter = mapping.find(key);

特定のグループ ID を取得することもできますinnerPair

int group_id = mapping[key];

operator<は に対して既に定義されているため、カスタム コンパレータを提供する必要はありませんstd::pair

于 2012-11-25T21:58:45.767 に答える
2

部分的なオブジェクトで検索したい場合は、 a ではなくstd::set<...>aを使用することをお勧めしstd::map<...>ます。

std::map<std::pair<int, int>, int>

とにかく、これはあなたがターゲットにした値の型とほぼ同じstd::set<...>です(違いは、firstメンバーが であると宣言されていることですconst)。

本当に a の使用を主張する場合は、最後のメンバーstd::set<...>を無視するコンパレータ タイプを作成する必要があります。混合型比較をサポートしてsecondいるかどうかはわかりません (サポートしていないと思います)。std::set<...>

于 2012-11-25T21:59:15.780 に答える
1

multiset、カスタム比較関数、またはファンクターを使用できます。たとえば、次のようになります。

struct innerPairCompare
{
    bool operator () (const setElement &a, const setElement &b)
    {
        const innerPair &a_ = a.first;
        const innerPair &b_ = b.first;
        return (a_.first > b_.first || a_.first = b_.first && a_.second > b_.second);
    }

};

その後、あなたのためにそれを使用してくださいmultiset

std::multiset<setElement,innerPairCompare> Foo;

同じリストにsetElement同じものをすべて保存します。innerPair

innerPairまたは、特定のですべてが必要な場合は、GroupIDgroupIDを比較する関数を使用します。

GroupID最後に、とをinnerPair一緒に保持する必要が本当にない場合は、またはをとして使用して、 map(またはmultimap)を使用できます。GroupIDinnerPairKey

于 2012-11-25T22:16:02.050 に答える
0

を使用し続けたい場合は、カスタム述語で使用できます。このstd::set回答をご覧ください。std::find_if

基本的に、関数を定義します

bool pairCorresponds(std::pair<int,int> element)

それはあなたのために仕事をします。

于 2012-11-25T21:57:50.130 に答える