問題タブ [boost-multi-index]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - ブースト マルチ インデックス コンテナーを使用してツリーを作成する方法
木を作ろうとしています。私の最初の要件は、ツリー レベル内のオブジェクトがその挿入順序で並べられることです。
最初の試みとして、stl ベクトル クラスを使用しました。
この小さなプログラムは正常にコンパイルされ、期待どおりに実行されます。
さらに一歩進んで、名前でツリー レベルのオブジェクトにアクセスする機能を追加したいので、ブースト マルチ インデックスを使用してみたので、Node クラスを次のように変更しました。
しかし、それはまったくコンパイルされません。gnu g++ バージョン 4.6.1 を使用すると、最初のエラーは
誰かがこの相互依存を解決するのを手伝ってくれませんか?
どうもありがとうございました。
よろしくお願いします
James Hopkin のおかげで、プログラムが部分的に動作するようになりました。
ここで、複数インデックス itrerator によって取得されたオブジェクトに要素を追加するために、replace/modify メソッドで作業する必要があります。
どうもありがとうございました。
c++ - boost :: multi_index :: multi_index_containerによって使用されるメモリを解放する方法は?
「person_map_tmulti_indexed_persons_map」によって使用されているメモリを解放するにはどうすればよいですか?私はグーグルでそれについて何かを見つけることができません。
これは私のテストコードです:
テスト方法:
- バイナリを開始します。
- 挿入が完了するまで待ちます。
- でメモリ消費量を確認します
ps u -C <binname>
。 - cin somthing、少なくとも1つの兆候。
- でメモリ消費量を再度確認してください
ps u -C <binname>
。
今はメモリを解放する必要がありますよね?
編集:
valgrind出力:
boost - Boost MultiIndex からの削除
クラス A のインスタンスに boost::shared_ptr を保持するブースト マルチインデックス構造があります。インデックスの 1 つの "find" 関数を使用すると、実際の値を取得できるイテレータ "it" が取得されます。を介してポインタA* a = it->get();
。マルチインデックス構造の関数がポインタやboost::shared_ptrではなくイテレータを取るa
ことを知って、マルチインデックスから削除するにはどうすればよいですか? erase
問題は、オブジェクトを消去したいプログラムのポイントにあります。最初のイテレータはもうなく、実際のポインタしかありません。
ありがとう
c++ - boost-multi-indexが間違ったイテレータを返すのはなぜですか?
Boostのドキュメントによると、iterator_toは有効なイテレータを返しますが、以下のコードは他のことが起こっていることを示しています。
Boost.MultiIndexのすべてのインデックスは、コンテナの特定の要素にイテレータを返すiterator_toというメンバー関数を提供します。
http://www.boost.org/doc/libs/1_51_0/libs/multi_index/doc/tutorial/indices.html#iterator_to
c++ - 順序付けられた一意のインデックスのキーとして参照のboost::tupleを使用してマルチインデックス挿入エラーをブーストします
私はこれを私が考えることができる最も単純なサンプルコードに要約しました。
メンバーによってインデックス付けされたブーストマルチがあります:
これを行うと、マルチインデックスはすべてのアイテムが等しいと見なすように見えます(サイズが1より大きいことはありません)
2つのメンバーを持つ構造を格納していますが、マルチインデックスの一意のキーを両方のメンバーにしたいと思います。参照のタプルを作成すると、これはかなり簡単に達成できると思いました。ただし、期待どおりに動作しません。タプル内のアイテムが参照である場合、すべての新しいアイテムが既存のアイテムと競合しているようです。参照から離れるだけでコードが期待どおりに動作することにも注意してください。ただし、参照ケースが機能しない理由を理解するのに役立ちません。
例で述べたように、タプルに値を保持させ、すべてを参照しない場合は、期待どおりに機能します。
私はさまざまな可能性を調査することに時間を費やしました(参照をぶら下げる、ブーストを比較する:マルチインデックスのない小さなプログラムでの参照のタプルなど)
これが私のコンパイルコマンドです:g ++ -O0 -ggdb -Wall -Werror test.cc -lboost_system -lpthread
プログラムを実行すると、次のようになります。
itr = 1 10 itr = 1 10
私が1,20と3,10を挿入しようとしているにもかかわらず、マルチはそれらが1,10に等しいと考えているように見えることを示しています。
私はかなり困惑しています。ありとあらゆる助けをいただければ幸いです。
c++ - コピーコンストラクターは、boost::multi_index_containerでカスタムソート述語を呼び出します
私はboost::multi_index_container
、オブジェクトのセットに対して複数のビューと並べ替え順序を提供するために使用しています。最近、(本質的に)すべてのオブジェクトの属性値を事前に計算し、これらの値を使用してそれらを並べ替えるカスタム並べ替え述語を使用してコンテナーを並べ替えたいと思いました(コード例については以下を参照)。
コンテナは正しくソートされますが、この述語を使用したソートは、オブジェクトの内部プロパティにoperator()
アクセスするだけの述語を使用したソートよりもはるかに時間がかかることに気付きました。
さらに調査したところ、私の述語の(暗黙的に定義された)コピーコンストラクターが非常に頻繁に呼び出されたことがわかりました。述語の各コピーには完全な属性マップのコピーが含まれているため、これには長い時間がかかりました。
それ以来、オブジェクトに内部属性を追加することでこれを解決しましたが、これが最善の行動であるとはまだ確信していません。だから、私は知りたいです:
- コピーコンストラクタがこれを頻繁に呼び出すのはなぜですか?
- 述語を正しく定義していますか?述語にはこれほど多くの内部データが含まれるべきではありませんか?
- さらに別の内部オブジェクト属性を定義するよりも良い解決策は何でしょうか?
これが私のコードの関連部分です。Object
その属性は問題に寄与しないため、クラスについてはあまり詳しく説明しませんでした。
c++ - multi_index 変更メンバーをブーストし、シーケンスを保持する
私はboost::multi_indexコンテナで作業しています。基本的に、データ セット情報が完全である場合は、いくつかのデータと情報で構成されます (アイテムがコンテナーに追加された時点では、情報はまだ完成していません)。注文品がコンテナに追加されたことを知る必要があるため、コンテナは順序付けされています。
iterationFinished が 1 に設定されているシーケンス項目を反復処理する反復子ペアを取得したいと考えています。
最初の std::copy には iterationFinished フラグへのインデックスが付いていますが、順序が正しくありません (コンテナにプッシュされたアイテムとして順序を指定したかったという意味で)
2 番目の std::copy は正しい順序を示しますが、 iterationFinished == 0 のアイテムも出力します。
ヒントはありますか?
boost-multi-index - 大規模なデータの集計: C++、ブースト、または RDBMS?
C++ で 6 億レコードのファイルを読み取り、フィールドの特定の基準 (例empl.loacation='FL' and empl.dept=3
) に基づいて集計を実行したいと考えています。
C++ の使用は実行可能なオプションですか? 私はデータベースルートに行くことができますが、私の要件が読み取り専用であることを考えると、疑問に思っていました-集計、C ++を使用できますか?
ブーストマルチインデックスライブラリを見ました。この種の操作には、プレーンな C++ や DB よりも適切ですか?
c++ - テンプレート引数を渡すときの MSVC++ コンパイラ エラー C2923
私はのを持っていmulti_index_container
ますstruct Person
:
ブーストのラッパークラスiterator_adaptor
:
最後に、このクラスのユーザーにクリーンなインターフェイスを公開し、boost のやや面倒なインターフェイスPersonMultiSet
を回避するために、のラッパー クラスを作成しました。multi_index_container
このコードを VS2010 でコンパイルすると、関数 foo の宣言で次のエラーが発生します。
コンパイラは、最初の使用時に型を決定することを許可していないようです ( fooIteratorAdaptor<PersonMultiSet::index<T>::type::iterator
をインスタンス化または呼び出す前に、このエラーが発生します)。PersonContainer
私は何を間違っていますか?
boost - composite_key を使用して multi_index_container からキーごとに要素を消去する
multi_index_container
であるインデックスを持つがありcomposite_key
ます。しかし、キーで要素を消去する方法が見つかりません。下記を参照してください:
erase(key)
複合ではないインデックスに対して機能します。しかし、複合キーの正しい構文が見つかりません。