2

C++ のマップに別のマップのすべてのキーが含まれているかどうかを確認すると、私の質問に答えることができますが、同時に 2 つのマップを反復処理する方法がわかりません。

示されているように、1つを反復処理する方法を知っています:

typedef std::map<QString, PropertyData> TagData;
TagData original = readFileToMap("FoxHud.bak");

for (TagData::const_iterator tagIterator = original.begin(); tagIterator != original.end(); tagIterator++) {
}
4

2 に答える 2

2

この方法を試してください:

// As std::map keys are sorted, we can do:

typedef std::map<string, int> TagData;
TagData map1;
TagData map2;
...
TagData::const_iterator map1It = map1.begin();
TagData::const_iterator map2It = map2.begin();

bool ok = true;
std::size_t cnt = 0;

while (map2It != map2.end() && map1It != map1.end()) {
    if (map1It->first != map2It->first) {
        map1It++;
    } else {
        map2It++;
        cnt++;
    }
}

if (cnt != map2.size()) ok = false;

cout << "OK = " << ok << endl;

これは、同じサイズではないマップでも機能するはずです。

于 2013-06-22T20:39:13.257 に答える
0

2 つのマップを同時に反復する場合は、次のようにします。

if (map1.size() != map2.size())
  ; // problem
else
{
  for (map<X,Y>::const_iterator it1 = map1.begin(),
                                it2 = map2.begin();
       it1 != map1.end() && it2 != map2.end();
       ++it1 , ++it2)
  {
    // ...
  }
}

ここで、2 つのマップを異なる「速度」で反復処理する場合は、while ループを使用して it1 と it2 のインクリメントを個別に調整する方が適切です。例については、ゴルガウトの回答を参照してください。

于 2013-06-22T20:44:10.707 に答える