2011-10-09 37 views
5

Vì vậy, tôi có 2 std::map s <string, shared_ptr<file> > một là 'cũ' là 'mới' Tôi muốn lấy tệp nào đã được loại bỏ và do đó có khả năng lặp lại differene thrue và làm một số công cụ để shared_ptr. Là điều đó có thể và làm thế nào để làm điều đó?Cách trừ một danh sách các phím bản đồ từ một bản đồ khác và lấy bản đồ mới (bản đồ A - mab B = bản đồ C)

+2

Hãy xem ''' std :: set_difference'''. –

Trả lời

9

Mặc dù thật dễ dàng để tự viết nội dung này (lặp lại trên A và kiểm tra xem khóa có xuất hiện trong B) không, đây có phải là công việc cho std::set_difference hay không. Chúng tôi sẽ cần một lambda hoặc một số vị tùy chỉnh để so sánh phím, mặc dù:

#include <iterator> 
#include <map> 
#include <string> 
#include <algorithm> 

typedef std::map<std::string, MyPtr> my_map; 

my_map A; // given 
my_map B; // given 

void make_a_difference() 
{ 
    my_map C; // will hold the result 

    std::set_difference(A.begin(), A.end(), 
         B.begin(), B.end(), 
         std::insert_iterator<my_map>(C, C.end()), 
       [](const my_map::value_type & a, const my_map::value_type & b) 
       { return a.first < b.first; } 
        ); 
} 

Nếu bạn muốn viết những dòng này cho mình, bạn nên cân nhắc lợi dụng thực tế là cả hai dãy đã được sắp xếp, vì vậy bạn có thể làm tốt hơn là tìm kiếm bằng phẳng cho sự tồn tại bằng cách thúc đẩy hai trình lặp song song.

Nếu bạn không có C++ 11, chỉ cần sử dụng vị này thay vì lambda:

bool my_comp(const my_map::value_type & a, const my_map::value_type & b) 
{ 
    return a.first < b.first; 
} 

Hãy coi chừng rằng không có sự so sánh về kiểu ánh xạ! Vì vậy, nếu bạn có cùng một khóa chuỗi trong cả hai bản đồ, thì sẽ không có mục nào trong kết quả, ngay cả khi hai giá trị được ánh xạ khác nhau. Nếu điều này là không mong muốn, bạn cần một vùng chứa đầu ra khác (ví dụ: std::multimap<my_map::key_type, my_map::mapped_type>) và một biến vị ngữ khác.

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