2016-10-06 4 views
0

としてモデル化された何かのコレクションを考える:コンテナ発注要件(ブーストを理解するための努力で:: multi_index)

idが固有で nameがnull {非ユニーク/非で
struct Foo { int id; std::string name; }; 

を|空の}。標準のSTLコンテナは、約束の地に私を取得されていません

select id, name from Foo group by name order by id 

は、どのように私は私のと同等の操作を行うことができますブースト:: multi_indexのようなデータ構造を使用してください。私は上の私のポイントを得るために上記のSQLバリアントを使用しました。私は実際にどのデータベースも扱っていません。

UPDATE:

だから、明らかに私が必要とするすべては、次のとおりです。

typedef boost::multi_index_container< 
    Foo, 
    indexed_by< 
    ordered_unique<identity<Foo>>, 
    ordered_unique<member<Foo, std::string, &Foo::name>> 
    > 
> MIC; 

誰かが私はこの権利を持って確認することができますか?それは動作するようです。私はまだそれをテストしていない。

+0

[std :: map、値でソートする方法、次にキーでソートする方法](http://stackoverflow.com/questions/19842035/stdmap-how-to-sort-byvalue-then-by -key) – Treycos

+0

@Treycosそれはまったく重複していません。私のSQLクエリをもう一度見てください。私はIDでソートするのではなく、名前でソートするように求めた。私はidでソートすると同時に、同じ*名前をすべてグループ化し、その中に_any_idを割り当てたいと言った。したがって、{1、 "Foo"} {2、 "Bar"} {3、 "Foo"}は最終的に{1、 "Foo" } {3、 "Foo"} – ForeverLearning

+0

私よりモゾが多い人は「この質問にはすでに回答があるかもしれない」というタグを削除できますか?私の場合は不適切だと思う。 – ForeverLearning

答えて

0

boostの使用の点では、あまり使用しませんが、この操作がどれ程効率的であるかによっては、ここでは必要ではないと私は考えています。

標準ライブラリコンテナがFooの場合は、簡略化のためstd::vector<Foo>としましょう。

std::string nameToSearchFor("Bar"); 
std::vector<Foo> vecFoos; 
std::vector<Foo> results; 
auto it = std::find_if(it, vecFoos.cend(), [&](const Foo& foo) { 
    return (foo.name == nameToSearchFor); 
}); 

while (it != vecFoos.cend()) 
{ 
    results.emplace_back(*it); 

    it = std::find_if(it, vecFoos.cend(), [&](const Foo& foo) { 
     return (foo.name == nameToSearchFor); 
    }); 
} 

std::sort(results.begin(), results.end(), [](const Foo& lhs, const Foo& rhs) { 
    return lhs.id < rhs.id; 
}); 

これは、任意のSTLコンテナ、またはその要素に少なくともForwardIteratorアクセス​​を提供する任意のコンテナで動作します:あなたは、次のような何かを行うことができます。しかし、std::unordered_multimapのようなものを使用している場合は、その内部のfind/equal_rangeメソッドを利用することをお勧めします。

これをスピードアップできる方法はたくさんありますが、小規模なデータセットでは必要なものが得られるはずの、簡単で分かりやすい方法です。

+0

ありがとう!私はこれを難しい方法でやる方法を知っています。 boost :: multi_indexはこの目的のために作られたようですが、私は無料でこのようなものを手に入れる方法を見たいと思っていました。私はショットを取ったし、私の更新されたポストを見れば、それは動作するようだ。私はより多くの入力でそれを広範囲にテストしていません。 – ForeverLearning

関連する問題