Làm cách nào để hợp nhất hai bản đồ STL thành một bản đồ? Cả hai đều có cùng loại giá trị khóa (bản đồ). Nếu có sự chồng chéo của các phím tôi muốn ưu tiên cho một trong các bản đồ.Hợp nhất hai bản đồ STL
Trả lời
Giả sử bạn muốn giữ các yếu tố trong MAPA, và hợp nhất các yếu tố trong mapB mà không có chìa khóa trong MAPA:
mapA.insert(mapB.begin(), mapB.end())
sẽ làm những gì bạn muốn, tôi nghĩ vậy.
EDIT: ví dụ thêm làm việc
#include <iostream>
#include <map>
void printIt(std::map<int,int> m) {
for(std::map<int,int>::iterator it=m.begin();it!=m.end();++it)
std::cout << it->first<<":"<<it->second<<" ";
std::cout << "\n";
}
int main() {
std::map<int,int> foo,bar;
foo[1] = 11; foo[2] = 12; foo[3] = 13;
bar[2] = 20; bar[3] = 30; bar[4] = 40;
printIt(foo);
printIt(bar);
foo.insert(bar.begin(),bar.end());
printIt(foo);
return 0;
}
đầu ra:
:!./insert
1:11 2:12 3:13
2:20 3:30 4:40
1:11 2:12 3:13 4:40
Nếu bạn muốn sao chép các mục từ một bản đồ khác, bạn có thể sử dụng std::map
's insert
:
targetMap.insert(sourceMap.begin(), sourceMap.end());
Nhưng lưu ý rằng insert
không cập nhật các phần tử nếu k của chúng ey đã có trong targetMap; những mục đó sẽ bị bỏ lại. Để ghi đè lên các yếu tố, bạn sẽ phải sao chép một cách rõ ràng, ví dụ:
for(auto& it : sourceMap)
{
targetMap[it.first] = it.second;
}
Nếu bạn không nhớ mất dữ liệu trong sourceMap
, một cách khác để đạt được một sao chép và ghi đè là insert
mục tiêu vào nguồn và std::swap
kết quả:
sourceMap.insert(targetMap.begin(), targetMap.end());
std::swap(sourceMap, targetMap);
Sau khi trao đổi, sourceMap
sẽ chứa targetMap
's dữ liệu cũ, và targetMap
sẽ là một kết hợp của hai bản đồ, với ưu tiên cho sourceMap
' s mục.
Theo tiêu chuẩn ISO/IEC 14882: 2003, mục 23.1.2, Bảng 69, biểu hiện a.insert (i, j):
trước: i, j là không lặp thành một. chèn mỗi phần tử từ phạm vi [i, j) nếu và chỉ khi không có phần tử nào có khóa tương đương với khóa của phần tử đó trong các vùng chứa có khóa duy nhất;
Vì std đó :: bản đồ phải tuân theo giới hạn này, nếu bạn muốn ưu tiên "giá trị" từ bản đồ này sang bản đồ khác, bạn nên chèn vào nó. Ví dụ:
std::map<int, int> goodKeys;
std::map<int, int> betterKeys;
betterKeys.insert(goodKeys.begin(), goodKeys.end());
Vì vậy, nếu có bất kỳ khóa tương đương nào trong goodKeys và betterKeys, "giá trị" của betterKeys sẽ được giữ nguyên.
- 1. Hợp nhất hai Bản đồ
- 2. Tạo loại hỗn hợp từ hai lớp enum, sẵn sàng cho bản đồ STL
- 3. bản đồ vectơ trong STL?
- 4. hiệu suất bản đồ stl?
- 5. Bản đồ STL trên bản thân?
- 6. Bản đồ STL - chèn hoặc cập nhật
- 7. Kết hợp hai Bản đồ vào một MultiMap
- 8. Làm thế nào tôi có thể hợp nhất hai bản đồ trên cùng một danh sách?
- 9. Kết hợp hai vectơ STL với một mẫu thay thế
- 10. Groovy có phương pháp hợp nhất 2 bản đồ không?
- 11. Bộ nhớ tùy chỉnh Allocator cho bản đồ STL
- 12. hợp nhất hai tệp
- 13. Sắp xếp thứ tự trong bản đồ STL và đặt
- 14. Không thể sử dụng bản đồ stl với struct?
- 15. khởi tạo một kích thước bản đồ STL `
- 16. Scala: cách hợp nhất một bộ sưu tập Bản đồ
- 17. Hợp nhất hai/ba bản ghi trong đường ray
- 18. Bản đồ hai hướng trong clojure?
- 19. Bản đồ một mục duy nhất của một bản đồ
- 20. Sự khác biệt giữa hai bản đồ
- 21. php hợp nhất hai mảng
- 22. Bản đồ hai chiều trong Cocoa
- 23. std :: hợp nhất sáp nhập hai std :: vector coredump
- 24. Bản đồ: hợp nhất nhiều bản vẽ có kích thước khác nhau
- 25. Bản đồ không đồng nhất
- 26. Hợp nhất hai hình ảnh với PHP
- 27. Hợp nhất hai ứng dụng đường ray
- 28. Java so sánh hai bản đồ
- 29. Lập bản đồ hai chiều của Python
- 30. Hai chiều/ngược lại bản đồ
Tôi không thể thấy cách nó không ghi đè một bản sao trong mapA nếu các phím phù hợp. Nếu tôi chỉ nói rằng mapB là bản đồ "ưa thích" của tôi, tôi có thể sử dụng cái này tôi nghĩ. Bằng cách đó nếu nó là một bản sao thì đó là chìa khóa trong mapB sẽ là một trong đó cuối cùng kết thúc vào trong bản đồ mới (mà bây giờ là mapA). Điều đó âm thanh chính xác hoặc tôi hiểu lầm những gì chèn không khi có một duplicatE? – JonF
Chèn sẽ không ghi đè lên các phần tử hiện có, khi có xung đột trong các khóa, phần tử đã tồn tại sẽ được ưu tiên. –
oh tôi hiểu rồi. unfortunetly nó không xây dựng mặc dù. Nó tạo ra một thông báo lỗi rất lớn – JonF