C++言語において、確率P(x,y)を実装しています。

P(x)については実装してみました。といってもmapを利用してkeyが何回出現したかをsecondのカウンターを利用して全体で割ったものですが、

std::map<int,int> P;
for(int i=0;i<10;i++)
 P.insert(std::make_pair(i,0));
P.find(rand())->second++;

のような形で、P(x)と見立てたものです。

しかし、P(a,b)のような2つの変数となるとどのような実装方法が適切かわかりません。

P(a,b)を実装したい理由は、P(a,b,c)のように変数が3つの場合に、cは任意とした場合、cについて全て走査する必要があり効率的で無いからです。

どのようなデータ構造を利用すればよいでしょうか。