You could fill a new container with the key, value pairs that exist in both maps using std::set intersection.
Set intersection requires sorted ranges (which an unordered map will not provide), so either replace the unordered maps with map or create temporary maps (or temporary std::setstd::pair<int, int>>s) before using set intersection.
If you use intersections frequently, I propose replacing your initial unordered maps with ordered maps for efficiency:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <map>
#include <unordered_map>
#include <vector>
int main() {
std::map<int, int> mp1 {{1,0}, {2,0}, {3,0}};
std::map<int, int> mp2 {{0,0}, {2,0}, {3,0}};
// this can be unordered unless you plan to use it in an intersection later:
std::unordered_map<int, int> mp;
std::set_intersection(
mp1.begin(), mp1.end(),
mp2.begin(), mp2.end(),
std::inserter(mp, mp.begin())
);
for(auto[key, val] : mp) {
std::cout << key << ',' << val << '\n';
}
}