4

私は3つのマップを持っています:

map<string, vector<int> > map1
map<string, vector<int> > map2
map<string, vector<int> > map3

map1 と map2 の両方に存在するすべての文字列と対応するベクトルを含む 3 番目のマップを作成する必要があります。文字列が同じであっても、それらのベクトルは異なる可能性があり、両方の共通文字列のすべてのベクトルを 1 つのベクトルに追加する必要があります。これは私が試みていることですが、私はちょっと迷っています:

for(map<string, vector<int> >::iterator it1=map1.begin(); it1 != map1.end(); it1++)
{
    string name = (*it1).first;
    for(map<string, vector<int> >::iterator it2=map2.begin(); it2 != map2.end(); it2++)
    {
        string name2 = (*it2).first;
        if (name == name2)
        {
            map3[name2] = (*it2).second;

        }
    }
}

ご協力ありがとうございました!!

4

3 に答える 3

4

マップは順序付けられているため、線形時間でこれを行うことができます。これは、タスクを実行するための 1 つの可能な方法です。

#include <map>
#include <string>
#include <vector>

typedef std::vector<int> vec_t;
typedef std::map<std::string, vec_t> map_t;
typedef map_t::const_iterator iter_t;

int main()
{
    map_t map1, map2, map3;

    iter_t it1 = map1.begin();
    iter_t it2 = map2.begin();

    while (it1 != map1.end() && it2 != map2.end()) {
        if (it1->first < it2->first) {
            ++it1;
        } else if (it2->first < it1->first) {
            ++it2;
        } else { // equal keys
            vec_t temp(it1->second);
            temp.insert(temp.end(), it2->second.begin(), it2->second.end());
            map3[it1->first].swap(temp); // swap contents to new map entry
            ++it1;
            ++it2;
        }
    }
}

これは、マップ キーの順序がデフォルトであると仮定していることに注意してくださいless<Key>

于 2012-10-11T18:16:21.093 に答える
2

できるよ

#include <algorithm>  // for std::copy
#include <iterator>   // for std::back_inserter
#include <map>
...

for(auto it = map1.begin(); it != map1.end(); ++it)
{
   auto fit = map2.find(it->first);
   if(fit != map2.end()
   {
      map3[it->first] = it->second;
      std::copy(fit->second.begin(), fit->second.end(), std::back_inserter(map3[it->first]));
   }
}
于 2012-10-11T16:48:47.790 に答える
1

1つの解決策は

map3 = map1;
typedef map<string, vector<int> > map_type;

for(map_type::iterator itr = map2.begin(); itr != map2.end(); ++itr)
{
    vector<int>& ref = map3[itr->first];
    ref.insert(ref.end(), itr->second.begin(), itr->second.end());
}

これにより、最初のマップのすべてのエントリが宛先に最初にコピーされます。次に、マップ内の各エントリに対して、出力マップ内の対応するエントリを検索します。まだ存在しない場合は、( を介してmap::operator[]) 新しいベクターを作成します。それ以外の場合は、既存の on への参照を返します。次に、2 番目のマップのベクトルが、結果に既に含まれているベクトルに追加されます。

欠点は、目的地マップで結果のマップを何度も検索することです。これは少し過剰に思えます。両方のマップがソートされているため、N-log-N 時間ではなく線形時間で実行できるはずです。

于 2012-10-11T16:49:57.843 に答える