我有自己的对象
class my_object
{
int id;
bool state;
string name;
string vendor;
}
我想将我的对象存储到两个map
中以便快速参考。
std::map<string, my_object> map1;
std::map<string, my_object> map2;
最后,我想检查两个地图中是否存在我的对象的某些键:
for(each my_object m1 in map1 and my_object m2 in map2 have the same key)
//for example, key "Bob" have corresponding objects in map1 and map2
{
if(m1.vendor == m2.vendor)
{
//do some work
}
}
如何在两张地图中完成比较作业? 或者我应该使用不同的数据结构?
更新: 谢谢你的回复。 为什么我使用两个地图是因为两个不同的函数将产生地图:
function1() //returns map1;
function2() //returns map2;
两张地图中使用的密钥是my_object的name
字段。对于“足够快的参考”,我认为如果map1有n个元素,map2有m个元素,那我的计算时间是n * m吗?
答案 0 :(得分:4)
你可以
for (const auto& m1 : map1) {
auto i2 = map2.find(m1.first);
if (i2 != map2.end() && m1.second.vendor == i2->second.vendor) {
// do some work
}
}
答案 1 :(得分:3)
您可以迭代其中一个地图(理想情况下,如果元素数量明显不同且性能很重要,则选择较短的地图),同时在另一个地图中依次搜索每个关键字(使用{ {3}})。
for (const auto& kv : map1)
{
auto it2 = map2.find(kv.first);
if (it2 != map2.end() && kv.second.vendor == it2->second.vendor)
...do whatever...
}
答案 2 :(得分:1)
这是一个程序,它将为两个映射中存在的每个键调用一个任意函数。它基于std::set_intersection的示例实现。
您可以修改lambda以执行vendor
相等测试或任何其他您想要的检查。
#include <map>
#include <string>
#include <iostream>
template<typename K, typename V1, typename V2, typename Func>
void map_intersection(std::map<K,V1> const &m1, std::map<K,V2> const &m2, Func f)
{
auto it1 = m1.begin(), it2 = m2.begin();
while (it1 != m1.end() && it2 != m2.end() ) {
if (it1->first < it2->first) {
++it1;
} else {
if (!(it2->first < it1->first)) {
f(it1->second, it2->second);
}
++it2;
}
}
}
int main()
{
std::map<std::string, std::string> map1 = { {"a", "apple"}, {"b", "bug"}, {"c", "car"} };
std::map<std::string, std::string> map2 = { {"b", "boat"}, {"c", "car"} };
map_intersection(map1, map2, [](std::string const &v1, std::string const &v2)
{
std::cout << "Same key: " << v1 << "," << v2 << '\n';
});
}
输出:
Same key: bug,boat
Same key: car,car