// 求两个map之间key的交集
// 条件: Key类型相同, Key比较函数相同, Value类型不限
template
typename std::vector::size_type
mapk_intersection(const std::map& m1, const std::map& m2, std::vector& keys)
{
typedef typename std::map M1;
typedef typename std::map M2;
if (m1.empty() || m2.empty())
return 0;
// 先确定两个map之间key的交集范围
M1::const_iterator m1_head = m1.lower_bound(m2.begin()->first);
M1::const_iterator m1_tail = m1.upper_bound(m2.rbegin()->first);
M2::const_iterator m2_head = m2.lower_bound(m1.begin()->first);
M2::const_iterator m2_tail = m2.upper_bound(m1.rbegin()->first);
// 获得两个范围后取交集
while ((m1_head != m1_tail) && (m2_head != m2_tail))
{
if (L()(m1_head->first, m2_head->first))
{
++m1_head;
}
else if (L()(m2_head->first, m1_head->first))
{
++m2_head;
}
else
{
keys.push_back(m1_head->first);
++m1_head;
++m2_head;
}
}
// OK
return keys.size();
}