假设Amap2
是空的,那么您上面发布的代码将正确工作。如果您尝试向已经包含该键的map
中insert
一个键值对,则旧值将被保留且新值将被丢弃。因此,如果您编写以下内容:
Amap2.insert(Amap1.begin(), Amap1.end())
在某些情况下,由于重复键不会被复制,您可能无法像预期的那样完全复制所有内容。
要将Amap2设置为等于Amap1,请考虑仅使用赋值运算符:
Amap2 = Amap1;
然而,这样做会盲目地丢弃Amap2
的内容,因此在执行此操作时要小心。
如果你想要将Amap2
中所有的键值对完全覆盖到Amap1
中,可以使用以下逻辑。 这里的思想类似于归并排序 - 我们将映射视为已排序值的序列,然后不断地将两个序列合并在一起:
void MergeMaps(map<int, A>& lhs, const map<int, A>& rhs) {
map<int, A>::iterator lhsItr = lhs.begin();
map<int, A>::const_iterator rhsItr = rhs.begin();
while (lhsItr != lhs.end() && rhsItr != rhs.end()) {
if (rhsItr->first < lhsItr->first) {
lhs.insert(lhsItr, *rhsItr);
++rhsItr;
}
else if (rhsItr->first == lhsItr->first) {
lhsItr->second = rhsItr->second;
++lhsItr; ++rhsItr;
}
else
++lhsItr;
}
lhs.insert(rhsItr, rhs.end());
}
通过这个,你可以编写
MergeMaps(Amap1, Amap2)
将所有Amap2
中的键值对复制到Amap1
中。
希望这能有所帮助!
随意编辑
*。 - Wolfstd::move
呢? - David Callanan