問題タブ [qhash]

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 に答える
102 参照

c++ - ファイルから読み取ったデータは、ファイル サイズよりも多くのメモリを消費します

次の方法でいくつかのデータをファイルに書き込みました。

ファイルは最終的に 484MB になりました。その後、私はループでそれを読みました:

この読み取りループの実行中に、タスク マネージャーでプログラムが約 1300MB のメモリを消費し始め、その後、「In file text\qharfbuzzng.cpp, line 626: Out of memory」というエラーが表示されます。私の質問は次のとおりです。プログラムが 2 倍以上のサイズのファイル メモリを使用し始め、それをチャンクで読み取る必要があるのは正常ですか、それとも何か間違っていますか?

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

qt - 部分キー マッチング QHash

私は次のようにQHash定義しています

次のように、このハッシュにいくつかの値を挿入しました。

次のようないくつかの QStrings があります。

これらの値が に存在するかどうかを調べることになっています。hashLookupつまり、 がOMG_1含まれているOMGため、 を取得できるはずOh my God!です。

私はこれを使用してこれをやろうとしました

もちろん、ルックアップ テーブルに存在せず、何も返さないキー OMG を検索しようとします。Qtでキー値の部分一致は可能ですか? はいの場合、これを実装するにはどうすればよいですか。

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

c++ - キーが見つからない場合の QHash の動作を理解する

注:この投稿の最後に、最小限の作業例があります。

Qt 5.7を使用しています。私が次のものを持っているとしましょうQHash

次のようにハッシュマップを初期化しました。

電話してテストしました

どちらも という同じ結果を返し3ます。HashKeyここで、整数をキャストして上記の2つのメソッドを呼び出すことにより、ハッシュマップの一部ではないキーで同じことを試みました。

私が得たのは8( を使用した最初の呼び出しの場合value().x) と5( を使用した 2 番目の呼び出しの場合find(...).value().x)です。

ドキュメントには次のように記載されています

ハッシュに指定されたキーを持つアイテムがない場合、これらの関数はデフォルトで構築された値を返します。

のリンクをたどったdefault-constructed valueところ、次のものが得られました。

[...] たとえば、QVector はそのアイテムをデフォルトで構築された値で自動的に初期化し、指定されたキーがマップにない場合、QMap::value() はデフォルトで構築された値を返します。ほとんどの値の型では、これは値がデフォルトのコンストラクタ (QString の空の文字列など) を使用して作成されることを意味します。ただし、int や double などのプリミティブ型、およびポインター型の場合、C++ 言語は初期化を指定しません。そのような場合、Qt のコンテナーは自動的に値を 0 に初期化します。

私の場合、これはHashValue()呼び出しを意味します。しかし、私が異なる結果を得たという事実は、控えめに言っても困惑しています。find(...)ドキュメントには、無効なキーが引数として渡された場合の動作については言及されていませんが、同じ結果が得られると予想されます。そのキーの最初の出現を見つけてイテレータを返すと言っているだけです(明らかに、value()上記の呼び出しでそれを呼び出しているためです)。

上から引用したドキュメント スニペットの後に (再び のドキュメントに戻るQHash)、

ハッシュに特定のキーが含まれているかどうかを確認するには、contains() を使用します。

contains()ハッシュマップをクエリするたびに呼び出す必要があることに対処できますが、これは 2 つの関数呼び出しを行うことを意味します。最初にキーが存在するかどうかを確認value(...)し、有効なエントリが見つかった場合は実際の値を取得するために呼び出します。以下の呼び出しは次を返します"Key 100 not found"

このチェックは内部で行われることを期待していますが、明らかにこれは行われません (私の推測では、このコンテナーのクエリ機能に対するパフォーマンスへの影響を防ぐためです)。

ここで問題になるのは、なぜこのようなことが起こっているのか、その下で実際に何が起こっているのかということです。

プロジェクトとそのコードは次のとおりです。

HashTest.pro

main.cpp