問題タブ [deque]
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.
java - std::deque に相当する Java
私は C++/STL 出身の比較的新しい Java プログラマーであり、これらの特性を持つクラスを探しています (私が理解しているように、C++ std::deque が持っている):
- 先頭/末尾の挿入/削除の O(1) パフォーマンス
- インデックスによるルックアップの O(1) パフォーマンス
- 成長可能なコレクションです(固定サイズの境界は必要ありません)
これに相当するJavaはありますか?挿入/削除と成長可能な特性を持つJava 1.6 [ArrayDeque]クラスを見つけましたが、O(1)ではないtoArray()を呼び出さない限り、インデックスによるルックアップはないようです。
c++ - 任意のインデックス範囲を持つ STL のようなベクトル
アクセスの複雑さ、サイズ変更時の再割り当てなどに関しては、STL ベクトルに似たものが必要です。任意のインデックス範囲をサポートする必要があります。 10. push_front を効率的にできるようにしたい。また、双方向のサイズ変更が必要です...
私は自分でこのようなものを書くことができることを知っていますが、これをサポートするすでに書かれたライブラリがあれば教えてください.
python - Queue.Queue と collections.deque の比較
複数のスレッドが物を入れることができ、複数のスレッドが読み取ることができるキューが必要です。
Python には少なくとも 2 つのキュー クラスと がQueue.Queue
ありcollections.deque
、前者は後者を内部的に使用しているようです。どちらもドキュメントでスレッドセーフであると主張しています。
ただし、キューのドキュメントにも次のように記載されています。
collections.deque は、ロックを必要としない高速のアトミックな append() および popleft() 操作を備えた無制限キューの代替実装です。
私はよく理解していないと思います:これは、dequeが完全にスレッドセーフではないことを意味しますか?
もしそうなら、私は 2 つのクラスの違いを完全には理解していないかもしれません。Queue がブロッキング機能を追加していることがわかります。一方、インオペレーターのサポートなど、いくつかの deque 機能が失われます。
内部dequeオブジェクトに直接アクセスすることは、
x in Queue().deque
スレッドセーフ?
また、deque が既にスレッドセーフであるのに、なぜ Queue はその操作にミューテックスを使用するのですか?
c++ - push_back または push_front が両端キューのイテレータを無効にするのはなぜですか?
タイトルが尋ねるように。
両端キューについての私の理解は、それが「ブロック」を割り当てたということでした。より多くのスペースを割り当てるとイテレータが無効になる方法がわかりません。どちらかといえば、両端キューのイテレータはベクトルよりも多くの保証を持っていると思うでしょう。
c++ - deque でのイテレータの無効化に関する混乱
deque でのイテレータの無効化に関して、私は少し混乱しています。(この質問の文脈で)
以下は抜粋です -- The C++ Standard Library: A Tutorial and Reference, by Nicolai M. Josuttis
先頭または末尾以外の要素を挿入または削除する と、deque の要素を参照するすべてのポインター、参照、および反復子が無効になります。
以下は、 SGIサイトからの抜粋です。
deque の反復子無効化のセマンティクスは次のとおりです。Insert (
push_front
およびを含むpush_back
) は、deque を参照するすべての反復子を無効にします。両端キューの途中で消去すると、両端キューを参照するすべての反復子が無効になります。pop_front
両端キュー (およびを含む) の先頭または末尾での消去は、消去されpop_back
た要素を指している場合にのみ反復子を無効にします。
IMHO、deque は、最初のブロックが一方向に成長し、最後のブロックが反対方向に成長するブロックのコレクションです。
push_back, push_front
deque イテレータに影響を与えるべきではありません (私は Josuttis に同意します)。
正しい説明は何ですか?これについて標準は何と言っていますか?
java - 任意の場所で要素を追加、追加、および取得するためのO(1)を持つデータ構造とは何ですか?
私はJavaソリューションを探していますが、一般的な答えもOKです。
Vector / ArrayListは、追加と取得の場合はO(1)ですが、追加の場合はO(n)です。
LinkedList(Javaでは二重リンクリストとして実装)は、追加と追加の場合はO(1)ですが、取得の場合はO(n)です。
Deque(ArrayDeque)は、上記のすべてに対してO(1)ですが、任意のインデックスの要素を取得することはできません。
私の考えでは、上記の要件を満たすデータ構造には、2つの拡張可能なリスト(1つは追加用、もう1つは追加用)があり、取得時に要素を取得する場所を決定するためのオフセットも格納されます。
c++ - std :: dequeからメモリを解放する方法は?
std::deque
かなりの数のオブジェクトを格納するためにを使用しています。これらのオブジェクトの束を削除すると、std :: vectorと同様に、メモリ使用量が減少しないように見えます。
それを減らす方法はありますか?ベクトルでは、「スワップトリック」を使用する必要があることを知っています。これは、ここでも機能すると思いますが、コンテナに残っているすべての要素をコピーする必要があるため、これは避けたいと思います(したがって、すべてのオブジェクトを2回保存するのに十分なメモリ)。私はdequeの実装に精通していませんが、多くのコピーがなくてもそのようなことを実現できる可能性があることを理解しています(ベクトルでは明らかにそうではありません)。
違いがあれば、VC ++(Dinkumware)STLを使用しています。
java - LinkedList などの既存のクラスを使用せずに Java Deque を使用しますか?
に非常に短いコードdeque
を書かなければなりませんが、メソッドのコードを書く方法がわかりません。もし誰かがメソッドの1つを手伝ってくれるなら(例えば、オブジェクトを追加するメソッド) deque の from に)、それで始められます。残りのメソッドを管理できると確信していますが、現時点ではかなり困惑しています。
python - Pythonキューへのインデックス付きアクセスを取得するための最良の方法、スレッドセーフ
(モジュールからの)キューがあり、そのキューへのQueue
インデックス付きアクセスを取得したいと思います。(つまり、キューからアイテム番号4を削除せずに、キュー内のアイテム番号4を要求できるようになります。)
キューが内部でdequeを使用し、dequeがインデックス付きアクセスを持っていることを確認しました。問題は、(1)キューを台無しにすることなく、(2)スレッドセーフを壊すことなく、どのように両端キューを使用できるかということです。
c++ - 大きなstd::listでの反復が非常に遅いのはなぜですか?
タイトルが示すように、std :: listをスタックとして使用し、リストのすべての要素を反復処理するプログラムで問題が発生しました。リストが非常に大きくなったとき、プログラムはあまりにも長くかかっていました。
誰かがこれについて良い説明がありますか?スタック/キャッシュの動作ですか?
(リストをstd::vectorとstd::deque(ちなみに驚くべきデータ構造)に変更することで問題を解決し、すべてが突然非常に速くなりました)
編集:私はばかではなく、リストの真ん中にある要素にアクセスしません。私がリストで行った唯一のことは、最後/最初の要素を削除/追加し、リストのすべての要素を反復処理することでした。そして、私は常にイテレータを使用してリストを反復処理しました。