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';
    }
}