問題タブ [unordered-set]
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++ - unordered_set: ポインター アドレスは適切なハッシュですか?
一連の (スマート) ポインターをハッシュ セットに格納したい<boost/unordered_set>
。10 秒考えた後、次のハッシュ関数を思いつきました。
私の質問は: このハッシュは良い考えですか? 私は、このハッシュの衝突がゼロまたは非常に少ないという考えを楽しんでいます(おそらく、ボンネットの下にいくつかの素数モジュラスがあり、私の楽しみがすべて台無しになっています)。
意図的な詳細:ハッシュの目的は、大きなオブジェクトのストレージをリサイクルすることです。そのため、大きなオブジェクトが既にビンにあるかどうかをすばやく検出する方法が必要です。
そうでない場合、スマートまたはダムのいずれかのポインターの理想的なハッシュは何でしょうか?
c++ - 標準コンテナ用のstd::hashの特殊化はありませんか?
単純に使用できないことに少し驚いた
std::hash
sの専門分野がないように思われるからですstd::array
。何故ですか?それとも私は単にそれを見つけられませんでしたか?実際に何もない場合、次の実装の試みを簡略化できますか?
これはどういうわけか標準ライブラリの一部であるべきだと私は本当に感じています。
c++ - unordered_set のメモリを解放するには?
std::unordered_set が取ったメモリを解放する方法を教えてください。
unordered_set::clear() は、メモリを解放せずにセットをクリアすると思います。
unordered_set の保持をローカル関数で解放する必要があります。ローカル関数を呼び出すたびにメモリが消費されるため、ローカル関数の最後でメモリを解放する必要があります。
ありがとうございました
c++ - std::hashを専門化する方法::順序付けされていないコンテナのユーザー定義型のoperator()?
でユーザー定義のキータイプをサポートstd::unordered_set<Key>
するには、ハッシュファンクターstd::unordered_map<Key, Value>
を提供する必要があります。operator==(Key, Key)
コンパイラやライブラリに付属している型のように、型のデフォルトのハッシュstd::unordered_set<X>
だけ
を使用して記述する方が便利です。相談後X
- C++標準ドラフトN3242§20.8.12 [unord.hash]および§17.6.3.4[hash.requirements]、
- Boost.Unordered
- g ++
include\c++\4.7.0\bits\functional_hash.h
- VC10
include\xfunctional
- StackOverflowのさまざまな関連質問
専門化することは可能のようですstd::hash<X>::operator()
:
C ++ 11のコンパイラサポートはまだ実験的です---私はClangを試しませんでした---、これらは私の質問です:
そのような特殊化を名前空間に追加することは合法
std
ですか?私はそれについて複雑な気持ちを持っています。std::hash<X>::operator()
C ++ 11標準に準拠しているバージョンはどれですか?それを行うためのポータブルな方法はありますか?
c++ - unordered_set を使用する場合の構造体のネストされた構造体のハッシュ関数
構造体の一意のリストを維持するために unordered_set を使用しようとしています。構造体 Name のハッシュ関数を定義しましたが、別の構造体メンバー Address を含むように Name 構造体を拡張すると、コンパイル エラーが発生します。Address 構造体をハッシュする方法を指定する必要があることはわかっていますが、どこでどのようにハッシュするかがわかりません。
アップデート
完了するために、これは修正でした:
c++ - std :: unordered_setクラスFooのメンバーとして
独自のタイプのunordered_setをメンバーとして持つクラスを作成しています。したがって、のスペシャライゼーションを作成する必要がありhash<Foo>
ます。この特殊化は、Fooが宣言された後に定義する必要があります。hash<Foo>
しかし、メンバーを定義する前に、すでに専門化が必要であるように思えunordered_set<Foo>
ます。少なくとも、コンパイルされず、そこで失敗します。ハッシュテンプレートの前方宣言を試みましたが、それでも機能させることができませんでした。
関連するコードスニペットは次のとおりです。
前もって感謝します
c++ - キーと値のペアの値のみを格納するように順序付けされていないSTLコンテナを適応させる方法は?
新しいC++11標準には、順序付けされていないコンテナーがあります。特に、(デフォルトのハッシュ関数)に基づいた場所にをstd::unordered_map<Key, Value>
格納します。同様に、に基づいた場所にキーを格納します。std::pair<Key, Value>
std::hash<Key>
std::unordered_set<Key>
std::hash<Key>
私の質問は、キーと値のペアの値のみをに基づいた場所に格納するにはどうすればよいstd::hash<Key>
ですか?これは、完全なハッシュ関数を使用する場合、つまり、異なるキーが異なるハッシュインデックスにマップされる場合に役立ちます(したがって、衝突の解決は必要ありません)。
unordered_setはキーのみを使用し、unordered_mapはキーと値の両方を使用するため、新しいC++11標準のunorderedSTLコンテナーではそのようなカスタマイズは許可されていないようです。既存のSTLコンテナからそのようなデータ構造を取得するための良い方法は何でしょうか?
より一般的には、キーの署名を表すタイプはどこにあるかにstd::pair<T, Value>
基づいて、をどのように場所に格納できますか?たとえば、Keyが大規模なデータ構造である場合、64ビットのハッシュキーを計算し、これを2つの32ビット部分に分割します。上位32ビットとValueがaを形成し、下位32ビットがこの場所を決定します。ペアが保存されます。std::hash<Key>
T
std::pair<uint32_t, Value>
これが役立つアプリケーションは、たとえばコンピュータチェスです。この場合、キータイプとしての位置(一部のプログラムでは数キロバイト)が64ビットキーにハッシュされ、そのうち上位32ビットと一部の検索関連情報のみが値として使用されます。タイプはstd::pair
、ハッシュキーの下位32ビットに基づく場所に(通常は合計16バイトのみ)格納されます。
c++ - gcc v4.1.2 で unordered_set のヘッダーを取得するには?
Boostをインストールせずにunordered_setを使いたい。追加しようとしまし--std=gnu++0x
たが、認識されたオプションではありません。v4.1.2 には unordered_set が含まれていますか? もしそうなら、どうすればヘッダーファイルを取得できますか?
これは Centos 4 マシンです。
c++ - 順序付けされていないセットでのコンパイルの問題
unordered_set
C++stdライブラリのを使用しようとしています。std名前空間を使用しています。
これunordered_set
は私の機能の範囲内です。いくつかの値をメモするために使用したいと思います。
ただし、次のコンパイルエラーが発生します。
CplusplusExperiment.cpp:関数内
'int do_crazy_calculations(int)'
:
CplusplusExperiment.cpp:10:10:エラー:'unordered_set'
タイプに名前を付けていません
make:***[CplusplusExperiment.o]エラー1
しかし、私はタイプをunordered_set
-に割り当てましたint
よね?このエラーはどういう意味ですか?
c++ - C++で順序付けられていないセットをどのように反復しますか?
順序付けられていないセットがあるとします
それをどのように繰り返すのですか?各要素に一度到達する限り、任意の順序で反復する必要はありません。私は試した
無駄に。