問題タブ [stdhash]
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::hash が std::reference_wrapper に特化されていないのはなぜですか?
そうだろうと思ったのですが、標準ライブラリの実装 (gcc-4.8.2) でこれを見つけることができません。
なぜstd::hash
まだ専門化されていないのstd::reference_wrapper
ですか?
c++ - テンプレート化されたキーの std::hash の特殊化
テンプレート化されたキーである独自のタイプのハッシュを特殊化しようとしていました。
私はそれをcppreferenceに基づいていました。
「C++ 標準はこの型のハッシュを提供していません」というコンパイル エラーが発生します。間違ったことをしただけだと思います。コンパイラはこの種のテンプレートをサポートできますか?
c++ - C++11: 一部の通常の型に「std::hash」を特殊化してはならない理由はありますか?
レギュラータイプとは、 Elements of Programmingの Stepanov の定義を意味します。つまり、基本的に、等しいという概念があり、互いのコピーであるオブジェクトは等しいということです。
したがって、 Regular TypeT
があり、等式関係が推移的 ( a == b && b == c => a == c ) の場合、次の定義と一致する (非自明な) ハッシュ関数を定義できます。等式 ( a == b => h(a) == h(b) )。いつも。
std::hash
しかし、標準には多くの専門分野は含まれていません。たとえば、 と の注目すべき例外をstd::complex
除いて、1 つもコンテナーもありません。vector<bool>
bitset
だから私はここに設計原則が何であるか疑問に思っています。
std::hash
または、別の質問:特殊化が規則的であり、等式が推移的である場合、独自の型に特殊化を提供しない理由はありますか?
c++ - unordered_map::find with key std::pair of pointer with custom hash crashes in VS2012
std::unordered_map
キー aが必要だったstd::pair<T*, T*>
ので、次のコードを「盗みました」:
このスタックオーバーフローの回答から。
gcc 4.9.2 を搭載した Linux マシンでは魅力的に動作します。ただし、Windows Visual Studio 2012 ではfind()
、my のメンバー関数を呼び出すとクラッシュしますunordered_map
。私の友人が Windows マシンでのクラッシュをデバッグし、「範囲外のベクトル添字」を与えることによって、デバッグ コンパイル モードでのみクラッシュすることを報告しました。
Q:
- 投稿されたコードはハッシュ a に対して有効です
std::pair<T*, T*>
か? - をハッシュするためのより堅牢な/より良い方法はあり
std::pair<T*, T*>
ますか? - この奇妙な動作の原因は何ですか?
PS: mcveを投稿しないことを深くお詫びしますが、投稿することは不可能です。
c++ - 内部スコープの列挙、ハッシュ関数、および unordered_set データ メンバー
次の問題があり、解決策が見つかりません。もちろん、解決策がまったく存在しない可能性もありますが、あきらめる前にSOを試してみたいと思います。
まず、エラーなしでコンパイルされるスニペット:
このコードを念頭に置いて、 をunordered_set
データ メンバーとして、S
または少なくとも派生クラスとして持つ必要があることに気付きました。std
考えられる実用的な解決策は、名前空間が閉じられたら、次の行を追加することです。
別の可能な解決策は、おそらく(私は試していませんが)スコープ外の列挙を使用することです。とにかく、私が最初に試みたのは、の定義をstruct S
次のように変更することでした。
(問題を正しく理解していれば)unordered_set
特殊なhash
関数が必要なため、これはエラーで終了します。とにかく、後者はS::E
少なくとも宣言する必要があるため、2 つのコードを交換するだけでは十分ではありません。
エラーログの最初の部分 (非常に長いため):
通常、このような場合は、次の例のように、前方宣言のようなもので解決できます。
残念ながら、構造体に埋め込まれた列挙型で同様のことを行うことができなかったため、この質問を開始しました。それを解決することは可能ですか、したがって、派生クラスを定義することを避けますか、またはこの場合、派生が唯一の実行可能な解決策ですか?D
c++ - 基本型の任意の数の属性を持つオブジェクトの std::hash バリエーション
討論:
たとえば、キーとして使用したい任意の数の属性を持つstruct
/があるとします。class
std::unordered_map
ハッシュファンクターを定義する必要があることはわかっています。たとえば、次のようになります。
そして、 mystd::unordered_map
を次のように定義します。
しかし、私を悩ませているのは、 の呼び出し演算子を定義する方法ですFooHasher
。私も好む傾向があるそれを行う1つの方法は、を使用することstd::hash
です。ただし、多数のバリエーションがあります。たとえば、次のとおりです。
次のスキームも見ました。
黄金比を追加する人もいます。
質問:
- の結果に黄金比を追加したり、ビットをシフトしたりすることで、彼らは何を達成しようとしていますか
std::hash
。 - 基本型の任意の数の属性を持つオブジェクトに対する「公式スキーム」はありますか?
std::hash
c++ - なぜ std::hash なのか恒等関数らしい
「g++ main.cpp -std=c++11」でコンパイルすると、結果は次のようになります。
なぜこうなった?私はライブラリを使用しておらず、特殊なハッシュ関数も持っていません。
補遺: セットのハッシュがそのコンポーネントのハッシュの合計である int の unordered_set の unordered_set のハッシュを定義したかったのですが、{2,4} のハッシュが{1,5} のハッシュ。これを回避する最も簡単な方法は、 std::hash double 関数を使用することです。