4

したがって、この質問はすでに尋ねられている可能性が高いです。見つかりませんでした。

std::mapを定義して値を挿入するたびに、次のコードを使用します。

using IntVector = vector < int > ;
map<int, IntVector> mapTmp;

int iKey = 7;
int iVal = 9;
if (mapTmp.find(iKey) == mapTmp.end())
    mapTmp.insert(pair<int, IntVector>(iKey, IntVector()));
mapTmp[iKey].push_back(iKey);

私を悩ませているのは3行です:

if (mapTmp.find(iKey) == mapTmp.end())
    mapTmp.insert(pair<int, IntVector>(iKey, IntVector()));
mapTmp[iKey].push_back(iVal);

Python は、 setdefaultと呼ばれる非常に便利な dict 関数を提供します。これは、本質的にこれら 3 行を 1 つの美しい行に結合します。C++ で書きたいとすると、次のようになります。

mapTmp.setdefault(iKey, IntVector()).push_back(iVal);

質問

  1. そのような機能を提供していますかC++?
  2. そうでない場合、誰もがその 3 行を常に書いていますか?
4

1 に答える 1

6

C++ 標準ライブラリで定義されたマップには、呼び出すだけで配列を変更operator[]できるというやや直観に反する動作があります。つまり、「マップにない場合はデフォルトを挿入する」ロジックはまったく不要です。次の 2 つのセグメントは同等です。

if (mapTmp.find(iKey) == mapTmp.end())
    mapTmp.insert(pair<int, IntVector>(iKey, IntVector()));
mapTmp[iKey].push_back(iVal);

と:

mapTmp[iKey].push_back(iVal);

2 番目のケースでiKeyは、 がマップに存在しない場合、最初にデフォルトで初期化されます。ベクトルの場合、空のベクトルを挿入するのと同じです。

Python がsetdefaultカバーする一般的なケースについては、何も知りません。マップにカスタム アロケータを提供することで効果が得られるかもしれませんが、お勧めしません。

于 2015-07-16T06:28:30.523 に答える