問題タブ [forward-list]
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++ - std::forward_list および std::forward_list::push_back
std::forward_listを使いたい
なぜなら:
フォワード リストは、コンテナのどこからでも要素をすばやく挿入および削除できるコンテナです。
しかし、*std::forward_list::push_back* の実装はありません。
それを行う理由が1つまたはまったくない場合でも、サポートを追加する高性能な方法はありますか?
c++ - forward_listの実装後のSplice_
forward_list
関数splice_after
(参照用)、具体的には、指定されたリンクの関数#3があります。list
が単独でリンクされていることを考慮して、それを実装するにはどうすればよいでしょうか。
演習として、実装するときに、前にノードに到達するまで(に接続できるように)、また前にノードに到達するまで(現在のリストのノードをノードに接続できるように)、リストを繰り返す必要がfirst
ありましたfirst
。前)。これは私にはひどく効率的ではないようで、反復なしでそれを行うためのより良い方法があるかどうか疑問に思っていましたか?last
last
last
c++ - プールメモリと std::forward_list
C++11 のノード用のメモリ プールを作成しますforward_list
。
BOOST プールメモリを で使用できますstd::forward_list
か?
c++ - リスト全体または std::forward_list の線形範囲をスプライシングするのはなぜですか?
あるリストから別のリストへの範囲のスプライシングは、size()
の複雑さを線形にすることを犠牲にして、一定の時間で達成できます。
C++11 では、一定時間であるstd::list
必要がある場合に変更されました。size()
これにより、たとえば gcc の実装が壊れました。[C++0x] std::list::size complexを参照してください。
range 以外splice()
に、以前の C++03 準拠の実装で一定時間にできなかった他の理由はありますか? size()
std::list
リスト全体または範囲を線形に接合するのはなぜ std::forward_list
ですか?
splice_after()
、ケース (1) および (3)を参照してください。標準ドラフト N3485の 23.3.4.6 forward_list 操作 [forwardlist.ops] も参照してください。も実装していstd::forward_list
ませんsize()
。
splice_after()
forward_list が単独でリンクされたリストであることは知っていますが、一定の時間で範囲を実行できない理由がわかりません。私はおそらくここで些細なことを見逃しています...
編集: OK、少なくとも部分的には私の誤解でした。4 がソース リストに残らないと思っていました。コード:
出力:
c++ - std::forward_listを使用して一定時間で範囲スプライスを行う方法は?
[first, last]
両方のエンドポイントを含めて range をスプライスしたい。before first
と toの要素へのイテレータがありますlast
。私はそれを行うことができましsplice_after()
たが、線形時間でしかできませんでした。
このスプライスは一定時間でできると思います。どうすればそれを行うことができstd::forward_list
ますか?
質問が明確でない場合は、私の問題を示すコード例を次に示します。
ライブワークスペースのコード
出力:
c++ - 高速中央値更新のアルゴリズム
ある時点で、N
数値のコレクションがあり、中央値の要素がわかっているとしますM
。これで、新しい値 が与えられたX
ので、 を更新する必要があるかもしれませんM
。(むしろ、扱っている数値がすべて一意であると仮定する必要があります。また、すべてのサンプルは連続して受信されるため、同時実行性の問題はありません。)
新しい平均の計算は簡単です。古い平均を取り、 を足しX
、 を掛けN
、 で割りN + 1
ます。(これは、N 個の要素の平均がどのように定義されているかを調べれば明らかです。今のところ、数値についてはあまり心配していません。)
私の質問は次のとおりです。中央値を更新するという問題に、創造的/斬新な(またはおそらく最適な)アプローチを提案できる人はいますか? 以下に例 (私自身の設計の簡単なアイデア) を示し、少し分析します。
このサンプルではstd::forward_list
、C++ 11 が最近これに遭遇した場所であるため、を使用します。std::forward_list<T> sorted;
一般性を失うことなく、これを正しい方法で行っていると仮定します: これまでに 遭遇した要素 (タイプ T) の順序付けられたリストを維持しますT x;
。
ところで、誰かがこれのためのより良い(より効率的/エレガントな)方法を持っているかどうか興味があります. 不満は大歓迎です。
X
は の一部になりました。私sorted
の考えを簡単に説明すると、次のようになります。
ここで起こる良いこと (多少見づらくない場合) は、次のとおりです。イテレータを 2 回前方に移動するため (そして安全に、2 回の比較の代償を払って追加することもできます)、 にend()
到達すると、適切な(中央値)値になります。奇数の要素M
がある場合は、そのサンプルだけです。そうでない場合は、この要素と古い (押し出された) 中央値の平均です。奇数と偶数が入れ替わるため、古いものと新しいもののどちらかM
が実際にコレクションに含まれます。この推論は正しいですよね?
私の O(3n) メソッドがゴミだと思うなら、コメントする必要はありません。出発点として提案しているだけです。
c++ - forward_list イテレータは安定していますか?
要求のリストを実装し、それらを一度に 1 つずつ送信し (スロットリング)、応答を待つ必要があります (常に順番に)。したがって、操作は次のとおりです。
- 挿入 (最後に)
- 削除 (開始時)
- 前に進む (「送信済み」ポインター)
を発見したばかりstd::forward_list
で、使おうと思っています。しかし、これが機能するためには、送信されたポインター用の 1 つのイテレーターと挿入用の 1 つのイテレーターを追跡する必要があり、オブジェクトを挿入および削除するときにそれらを壊すことはできません。
直感的には、リンクされたリストの反復子は挿入と削除に対して安定していると思いますが、誰かがこれを確認できますか。また、挿入イテレータをリセットする必要があるリストを空にする場合、特別なケースを作成する必要がありますbefore_begin
か?
stl - forward_list は xlc でサポートされていますか
コードをxlCに移植しています。
forward_list が xlC でサポートされているかどうか疑問に思っていますか?
私はテストプログラムで試しました
g++ では問題なくコンパイルできますが、xlC ではエラーが発生します。
次のコンパイル行を試してみました:
xlC forward_list_test.cpp
xlC -D __IBMCPP_TR1__ forward_list_test.cpp
しかし、エラーは同じです:
"forward_list_test.cpp", 行 1.10: 1540-0836 (S) #include ファイルが見つかりません。
サポートされている場合、コンパイルするために何か追加する必要がありますか?
注:xlC 11を使用