問題タブ [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.

0 投票する
1 に答える
1526 参照

c++ - std::hash が std::reference_wrapper に特化されていないのはなぜですか?

そうだろうと思ったのですが、標準ライブラリの実装 (gcc-4.8.2) でこれを見つけることができません。

なぜstd::hashまだ専門化されていないのstd::reference_wrapperですか?

0 投票する
1 に答える
1130 参照

c++ - テンプレート化されたキーの std::hash の特殊化

テンプレート化されたキーである独自のタイプのハッシュを特殊化しようとしていました。

私はそれをcppreferenceに基づいていました。

「C++ 標準はこの型のハッシュを提供していません」というコンパイル エラーが発生します。間違ったことをしただけだと思います。コンパイラはこの種のテンプレートをサポートできますか?

0 投票する
2 に答える
260 参照

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または、別の質問:特殊化が規則的であり、等式が推移的である場合、独自の型に特殊化を提供しない理由はありますか?

0 投票する
1 に答える
895 参照

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:

  1. 投稿されたコードはハッシュ a に対して有効ですstd::pair<T*, T*>か?
  2. をハッシュするためのより堅牢な/より良い方法はありstd::pair<T*, T*>ますか?
  3. この奇妙な動作の原因は何ですか?

PS: mcveを投稿しないことを深くお詫びしますが、投稿することは不可能です。

0 投票する
2 に答える
635 参照

c++ - 内部スコープの列挙、ハッシュ関数、および unordered_set データ メンバー

次の問題があり、解決策が見つかりません。もちろん、解決策がまったく存在しない可能性もありますが、あきらめる前にSOを試してみたいと思います。

まず、エラーなしでコンパイルされるスニペット:

このコードを念頭に置いて、 をunordered_setデータ メンバーとして、Sまたは少なくとも派生クラスとして持つ必要があることに気付きました。std考えられる実用的な解決策は、名前空間が閉じられたら、次の行を追加することです。

別の可能な解決策は、おそらく(私は試していませんが)スコープ外の列挙を使用することです。とにかく、私が最初に試みたのは、の定義をstruct S次のように変更することでした。

(問題を正しく理解していれば)unordered_set特殊なhash関数が必要なため、これはエラーで終了します。とにかく、後者はS::E少なくとも宣言する必要があるため、2 つのコードを交換するだけでは十分ではありません。

エラーログの最初の部分 (非常に長いため):

通常、このような場合は、次の例のように、前方宣言のようなもので解決できます。

残念ながら、構造体に埋め込まれた列挙型で同様のことを行うことができなかったため、この質問を開始しました。それを解決することは可能ですか、したがって、派生クラスを定義することを避けますか、またはこの場合、派生が唯一の実行可能な解決策ですか?D

0 投票する
2 に答える
677 参照

c++ - 基本型の任意の数の属性を持つオブジェクトの std::hash バリエーション

討論:

たとえば、キーとして使用したい任意の数の属性を持つstruct/があるとします。classstd::unordered_map

ハッシュファンクターを定義する必要があることはわかっています。たとえば、次のようになります。

そして、 mystd::unordered_mapを次のように定義します。

しかし、私を悩ませているのは、 の呼び出し演算子を定義する方法ですFooHasher。私も好む傾向があるそれを行う1つの方法は、を使用することstd::hashです。ただし、多数のバリエーションがあります。たとえば、次のとおりです。

次のスキームも見ました。

黄金比を追加する人もいます。

質問:

  1. の結果に黄金比を追加したり、ビットをシフトしたりすることで、彼らは何を達成しようとしていますかstd::hash
  2. 基本型の任意の数の属性を持つオブジェクトに対する「公式スキーム」はありますか?std::hash
0 投票する
3 に答える
7443 参照

c++ - なぜ std::hash なのか恒等関数らしい

「g++ main.cpp -std=c++11」でコンパイルすると、結果は次のようになります。

なぜこうなった?私はライブラリを使用しておらず、特殊なハッシュ関数も持っていません。

補遺: セットのハッシュがそのコンポーネントのハッシュの合計である int の unordered_set の unordered_set のハッシュを定義したかったのですが、{2,4} のハッシュが{1,5} のハッシュ。これを回避する最も簡単な方法は、 std::hash double 関数を使用することです。