你上面貼的代碼將正常工作假設Amap2
是空的。如果您嘗試將insert
鍵/值對存儲到已保存該鍵的map
中,則舊值將被保留,並且新值將被丟棄。因爲這個原因,如果你寫
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 the rhs value is less than the lhs value, then insert it into the
lhs map and skip past it. */
if (rhsItr->first < lhsItr->first) {
lhs.insert(lhsItr, *rhsItr); // Use lhsItr as a hint.
++rhsItr;
}
/* Otherwise, if the values are equal, overwrite the lhs value and move both
iterators forward. */
else if (rhsItr->first == lhsItr->first) {
lhsItr->second = rhsItr->second;
++lhsItr; ++rhsItr;
}
/* Otherwise the rhs value is bigger, so skip past the lhs value. */
else
++lhsItr;
}
/* At this point we've exhausted one of the two ranges. Add what's left of the
rhs values to the lhs map, since we know there are no duplicates there. */
lhs.insert(rhsItr, rhs.end());
}
有了這個,你可以寫
MergeMaps(Amap1, Amap2);
複製從Amap2
到Amap1
的所有鍵/值對。
希望這會有所幫助!
@Wolf:這兩種方法都在答案中給出。這是一個協作編輯的社區,如果您想添加答案,請隨時編輯它。 – 2016-05-11 13:13:55
@Wolf:請不要大幅修改其他人的答案,尤其是那些在5年前寫過的,已經被人們上傳並被OP接受的答案。隨意編寫自己的,相互競爭的答案。 – 2016-05-11 13:29:39
@LightnessRacesinOrbit我問過它,OP明確授予給我:*'隨意編輯它* – Wolf 2016-05-11 13:31:40