C++ 如何找到两张地图中的所有公用键?

C++ 如何找到两张地图中的所有公用键?,c++,stl,map,vector,C++,Stl,Map,Vector,我有3张地图: map<string, vector<int> > map1 map<string, vector<int> > map2 map<string, vector<int> > map3 map1 地图2 地图3 我需要创建第三个映射,其中包含map1和map2中存在的所有字符串及其对应的向量。问题是,即使字符串相同,它们的向量也可能不同,我必须将两个公共字符串中的所有向量附加到一个向量中。 这是我正在尝试

我有3张地图:

map<string, vector<int> > map1
map<string, vector<int> > map2
map<string, vector<int> > map3
map1
地图2
地图3
我需要创建第三个映射,其中包含map1和map2中存在的所有字符串及其对应的向量。问题是,即使字符串相同,它们的向量也可能不同,我必须将两个公共字符串中的所有向量附加到一个向量中。 这是我正在尝试的,但我有点迷路了:

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;

        }
    }
}
for(map::iterator it1=map1.begin();it1!=map1.end();it1++)
{
字符串名=(*it1);
for(map::iterator it2=map2.begin();it2!=map2.end();it2++)
{
字符串名称2=(*it2);
if(name==name2)
{
map3[name2]=(*it2);
}
}
}
非常感谢你的帮助

你能行

#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]));
   }
}
#包含//用于std::复制
#包含//用于std::back\u插入器
#包括
...
对于(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_插入器(map3[it->first]);
}
}
一种解决方案是

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());
}
map3=map1;
类型定义映射类型;
对于(map_type::iterator itr=map2.begin();itr!=map2.end();++itr)
{
向量&ref=map3[itr->first];
ref.insert(ref.end(),itr->second.begin(),itr->second.end());
}
这首先将第一个映射中的所有条目复制到目标。然后,对于映射中的每个条目,它在输出映射中查找相应的条目。如果该条目不存在,它将创建一个新的向量(通过
map::operator[]
),否则,它将返回对现有on的引用。然后将第二个映射中的向量附加到结果中已有的向量


缺点是,您在目标地图中一遍又一遍地搜索结果地图,这似乎有点过分。由于两个地图都已排序,它应该能够在线性时间内完成搜索,而不是在N-log-N时间内完成搜索。

由于地图已排序,您可以在线性时间内完成搜索。这是完成任务的一种可能方法:

#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;
        }
    }
}
#包括
#包括
#包括
typedef std::向量向量;
typedef std::map\u t;
typedef映射:常量迭代器iter;
int main()
{
地图1、地图2、地图3;
iter_t it1=map1.begin();
iter_t it2=map2.begin();
while(it1!=map1.end()&&it2!=map2.end()){
如果(it1->firstfirst){
++it1;
}否则如果(it2->firstfirst){
++it2;
}else{//相等键
车辆温度(it1->秒);
temp.insert(temp.end(),it2->second.begin(),it2->second.end());
map3[it1->first]。交换(临时);//将内容交换到新的映射条目
++it1;
++it2;
}
}
}

请注意,这假设贴图键顺序是默认的
更少

是否对键进行设置交集(结果仅为两个键中都存在的那些键)或设置并集(如果在map1或map2或两者中都出现,则结果将有一个键)@sumrania:Union将是A中的所有键和B中的所有键,而不是两个集中的所有键。Dave S是正确的。@ChrisDogget我需要找到A中的所有键和B中的所有键,但是公共键应该只出现一次而不是两次。是不是it1->first和it2->first字符串?如何使用if条件来设置一个S字符串比另一个小?@sumrania:是的,键是字符串。因为映射的内容是按键排序的,所以我只是使用字符串比较来测试哪个字符串比另一个小。键没有被改变,只是比较。(
std::string
定义了一个
操作符