2012-04-10 40 views
11

Tôi đang tự hỏi nếu có một cách để giao nhau hoặc làm cho sự khác biệt giữa hai cấu trúc định nghĩa là std::set<MyData*>std::map<MyData*, MyValue> với các thuật toán tiêu chuẩn (như std::set_intersect)Có cách nào để giao nhau/diff một std :: map và std :: set?

Vấn đề là tôi cần phải tính toán sự khác biệt giữa các thiết lập và keyset của bản đồ nhưng tôi muốn tránh tái phân bổ nó (vì nó là cái gì đó được thực hiện nhiều lần trong một giây với cấu trúc dữ liệu lớn). Có cách nào để có được "chế độ xem chính" của std::map không? Sau khi tất cả những gì tôi đang tìm kiếm là chỉ xem xét các phím khi thực hiện các hoạt động thiết lập như vậy từ một điểm thực hiện nó nên có thể nhưng tôi đã không thể tìm thấy bất cứ điều gì.

+0

Hãy xem bộ lọc filter_iterator trong thư viện trình tăng tốc. –

+1

Xin lỗi, không phải filter_iterator - transform_iterator. Xem Câu trả lời ẩn danh. –

Trả lời

8

Bạn có thể sử dụng transform_iterator từ thúc đẩy để thích ứng với các std::map iterator và chỉ trả lại các phím:

#include <algorithm> 
#include <iostream> 
#include <map> 
#include <iterator> 
#include <string> 
#include <set> 
#include <vector> 

#include <boost/iterator/transform_iterator.hpp> 

typedef std::map<std::string, int> map_t; 
typedef std::set<std::string> set_t; 

const map_t::key_type & getKey(const map_t::value_type & pair) 
{ 
    return pair.first; 
} 

typedef const map_t::key_type & (*getKey_t)(const map_t::value_type &); 

typedef boost::transform_iterator<getKey_t, map_t::iterator> key_iterator_t; 

int main() 
{ 
    map_t map; 
    map["a"]=1; map["b"]=2; 
    set_t set; 
    set.insert("a"); set.insert("c"); 

    std::vector<std::string> v; 

    std::set_intersection(set.begin(), set.end(), 
     key_iterator_t(map.begin(), getKey), 
     key_iterator_t(map.end(), getKey), 
     std::back_inserter(v)); 
    std::copy(v.begin(), v.end(), 
     std::ostream_iterator<std::string>(std::cout," , ")); 
} 
1

set_intersection công trình trên các bộ sưu tập ra lệnh. Bạn có thể viết một trình vòng lặp tùy chỉnh bao bọc trình vòng lặp bản đồ chuẩn và trả về khóa. Sau đó, bạn có thể sử dụng tính năng này với set_intersect

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