しかし、ちょっと話題はずれるけど、

std::ostream& operator<<(std::ostream& os, const Pairs& p)
{
os << p.first << ' ' << p.second;
return os;
}

std::copy(pairs.begin(), pairs.end(), std::ostream_iterator<Pairs>(std::cout, "\n"));

このコードBCCでは通るけど、VC7.1、gcc3.1.1(MinGW)では通らねーな。
std::coutなどに<<を食わせるのと、std::ostream_iteratorに食わせるのでは
何が違うのかな。