2010-09-03 39 views
48

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

91

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 
+0

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

+9

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. –

+0

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

22

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.

1

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.

Các vấn đề liên quan