14

次のようなコードをよく見かけます。

if(myQMap.contains("my key")){
    myValue = myQMap["my key"];
}

理論的には、QMap で 2 つのルックアップを実行します。

私の最初の反応は、次のように置き換える必要があるということです。これは、1 回のルックアップのみを実行し、2 倍速くなるはずです。

auto it = myQMap.find("my key");
if(it != myQMap.end()){
    myValue = it.value();
}

QMap がこの最適化を自動的に行ってくれるのでしょうか? 言い換えれば、QMap が見つかった最後の要素の位置を保存しQMap::contains()、次の検索を実行する前に最初にチェックするかどうか疑問に思っていますか?

4

2 に答える 2

6

クラスへのインターフェースを改善するために、QMap が両方の機能を提供することを期待しています。「検索」関数を呼び出すよりも、指定されたキーを持つ値がマップに「含まれている」かどうかを尋ねる方が自然です。

コードが示すように、find と contains の両方が次の内部関数を呼び出します。

Node *n = d->findNode(akey);

したがって、返されたイテレータを使用する場合は、find を使用して戻り値を確認する方が効率的ですが、値がマップに存在するかどうかだけを知りたい場合は、contains を呼び出す方が読みやすくなります。

ソース コードを見ると、QMap がノードのバイナリ ツリー構造として実装されていることがわかります。findNode を呼び出すと、ノードを反復処理し、結果をキャッシュしません。

于 2013-11-14T09:32:19.450 に答える
2

QMap のソース コードは、メソッドに特別なコードがないことを示しています。QMap::contains()

場合によっては、QMap::value()orを使用QMap::values()してキーの値を取得し、それが正しいかどうかを確認できます。これらのメソッド (および const operator[]) は値をコピーしますが、基になるデータは書き込み時にコピーされるため (特にQMapそれ自体)、ほとんどの Qt タイプではおそらく問題ありません。

于 2013-11-14T07:10:59.990 に答える