// 求两个map之间key的交集
// 条件: Key类型相同, Key比较函数相同, Value类型不限
template <typename K, typename L, typename V1, typename V2>
typename std::vector<K>::size_type
mapk_intersection(const std::map<K, V1, L>& m1, const std::map<K, V2, L>& m2, std::vector<K>& keys)
{
typedef typename std::map<K, V1, L> M1;
typedef typename std::map<K, V2, L> 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();
}
求两个map之间key的交集
最新推荐文章于 2024-05-20 11:14:38 发布