c++のmapの使い方について


[AtCoderの問題](https://atcoder.jp/contests/abc019/tasks/abc019_3)
を解くにあたって、mapを使った以下の解法について質問がございます。

### 質問内容

`map<int, int>`
が何と何のペアで結びついてるのかわかりません。mp.firstは入力例3で言うと2,3,5,7だと思ってるのですが、mp.secondって最初はただの空箱という認識で合ってますでしょうか？  
また、

2→2で割り切れるから割って1になる→1→まだないから0を返す  
3→まだないから1を返す  
5→まだないから2を返す  
7→まだないから3を返す

で0,1,2,3の合計４が答え、という仕組みかと思ったのですが、`mp[num]=1` が何をしてるのかよくわかりません。よろしくお願い致します。

### 現状のコード

[code]

    #include <bits/stdc++.h>
    using namespace std;
    
    int main(){
        int N;
        cin >> N;
        map<int,int> mp;
        for(int i = 0; i < N; ++ i){
            int num;
            cin >> num;
            while(num%2==0){
                num /= 2;
            }
            mp[num] = 1;
        }
        cout << mp.size() << endl;
        return 0;
    }
    
[/code]




挙動は他の方が答えているとおりで正しいのですが、今回の場合、キーに対応する値が常に `1` であり、保存する意味がありません。このような場合は
`std::set` を用いるほうが良いです。`std::set<T>` は、`T`
型の（重複しない）値の集合を表します。すでに挿入された値をもう一度挿入すると何も起こりません。

今回のコードの場合、 `map<int,int>` の代わりに `set<int>`、`mp[num] = 1` の代わりに
`mp.insert(num)` とすることで書き換えることができます。

