2009-07-01 30 views
13

Tôi có hai bản đồ:Làm cách nào để nối thêm nội dung của một bản đồ vào một bản đồ khác?

map< string, list <string> > map1; 
map< string, list <string> > map2; 

Tôi đã cư map1, bây giờ tôi muốn sao chép nội dung map1 vào map2. Vì vậy, tôi chỉ đơn giản là đã làm:

Tôi có một số hoạt động cho rằng map1 lấp đầy với

1. kiran, c:\pf\kiran.mdf, c:\pf\kiran.ldf 
2. test, c:\pf\test.mdf, c:\pf\test.mdf 

Và bây giờ tôi phải điền map2 với nội dung này. Và bản đồ agian1 điền thông tin

1. temp, c:\pf\test.mdf, c:\pf\test.ldf 
2. model, c:\model\model.mdf, c:\pf\model.ldf 

Bây giờ tôi phải nối các nội dung này vào map2. Làm thế nào để tôi làm điều này?

+2

Làm thế nào để cho nó xảy ra rằng bạn và người dùng Dễ hỏi những câu hỏi rất giống nhau ở gần như cùng một lúc? – sharptooth

+2

Được rồi, nhưng vấn đề đặt câu hỏi hai lần là gì? Một trong các bạn có thể đặt câu hỏi và sau đó cả hai bạn có thể thấy câu trả lời. Sao chép câu hỏi chỉ làm loãng nỗ lực của cộng đồng và bạn nhận được câu trả lời ít tốt hơn. – sharptooth

+0

(Tôi đã kết hợp hai câu hỏi giống nhau) –

Trả lời

3

Bạn có thể làm nhiều cách khác nhau này tùy thuộc vào những gì bạn muốn làm:

  1. Sử dụng constructor sao chép:

    map< string, list <string> > map1; 
    // fill in map1 
    
    map< string, list <string> > map2(map1); 
    
  2. Sử dụng toán tử gán như bạn chỉ rõ trong câu hỏi:

    map< string, list <string> > map1; 
    map< string, list <string> > map2; 
    
    // fill in map1 
    
    map2 = map1; 
    
  3. Do tất cả chính mình bằng tay:

    map< string, list <string> > map1; 
    map< string, list <string> > map2; 
    
    // fill in map1 
    
    for (map< string, list <string> >::iterator i = map1.begin(); 
        i <= map1.end(); ++i) { 
        map2[i.first()] = i.second(); 
    } 
    

Nghe có vẻ như (1) là những gì bạn muốn.

+1

Tôi muốn thêm: std :: copy (map1.begin(), map1.end(), insert_iterator (map2, map2.begin()) là một cách khác –

+0

Tôi đã mong đợi đây là câu trả lời ở lần chụp đầu tiên – Uday

7

Bạn có thể sử dụng phương thức chèn của bản đồ. Ví dụ:

std::map<int, int> map1; 
    std::map<int, int> map2; 

    map1[1] = 1; 

    map2.insert(map1.begin(), map1.end()); 
    map1.clear(); 

    map1[2] =2; 
    map2.insert(map1.begin(), map1.end()); 
+0

map1 [1] = 1; nó có thể làm gì mà bạn có thể nói với tôi ... – Cute

+0

Nó chỉ là một ví dụ .. có nghĩa là val chính: 1 bản đồ cho giá trị 1 :-) – Naveen

40
map<int,int> map1; 
map<int,int> map2; 
map1.insert(map2.begin(), map2.end()); 

này sẽ chèn vào map1 các yếu tố từ đầu đến cuối map2. Phương pháp này là tiêu chuẩn cho tất cả cấu trúc dữ liệu STL, vì vậy bạn thậm chí có thể làm điều gì đó như

map<int,int> map1; 
vector<pair<int,int>> vector1; 
vector1.insert(map1.begin(), map1.end()); 

Hơn nữa, con trỏ cũng có thể hoạt động như trình lặp!

char str1[] = "Hello world"; 
string str2; 
str2.insert(str1, str1+strlen(str1)); 

Bạn nên nghiên cứu phép thuật của STL và trình lặp!

+0

Nhớ khoảng trống giữa hai '>>' :) – GManNickG

+1

Ồ vâng, một số trình biên dịch sẽ phàn nàn về tham số mẫu lồng nhau (* ho * GCC), vì >> trông giống như toán tử trích xuất luồng. Vì vậy, bạn có thể cần một không gian ở giữa. Tôi đến từ một thế giới Windows, mặc dù, và trình biên dịch trong Visual Studio làm điều đúng. :) –

+0

thông tin tốt - cảm ơn! – AdamC

0

Tôi nghĩ rằng bạn muốn điều này:

mapb.insert(mapa.begin(), mapa.end()); 

Tôi tin rằng sẽ chỉ cần bỏ qua bất kỳ khóa đã tồn tại trong mục tiêu. Nếu bạn muốn ghi đè các giá trị cho các khóa trùng lặp, bạn sẽ phải lặp qua các mục, chèn từng mục, kiểm tra cặp kết quả và thay thế giá trị.

Đối với "ba bản đồ" trường hợp, bạn sẽ cần phải:

mapc.insert(mapa.begin(), mapa.end()); 
mapc.insert(mapb.begin(), mapb.end()); 
0

Nếu bạn muốn chèn bản đồ của bạn khi bạn định nghĩa nó, điều này là tốt đẹp:

payload.insert({ 
      { "key1", "one" }, 
      { "key2", 2 }, 
     }); 
Các vấn đề liên quan