2012-11-22 27 views
6

Tôi đã hỏi trong một câu hỏi khác về vấn đề trong multiset, nhưng bây giờ tôi thấy tôi cần một sự hiểu biết tốt và không thể tìm thấy bất kỳ ví dụ phức tạp hơn trên internet.multiset in C++

bạn có thể giải thích cho tôi, có thể ví dụ, cách multiset<A,B> hoạt động và chức năng nào ở đây của A và B và cũng có thể bỏ qua bất kỳ nội dung nào trong số đó không? Tôi có thể đặt A hoặc B cho một số biến không? Tôi thực sự đánh giá cao một số ví dụ ngắn hoặc tham chiếu,

+1

'std :: multiset' là một mẫu chuẩn từ gần đây C++ (đặc biệt là năm 2011 tiêu chuẩn) thư viện. Bạn có quen thuộc với các mẫu C++ nói chung không? Bạn có hiểu 'std :: vector' và' std :: map' đã ?? –

+0

http://www.sgi.com/tech/stl/multiset.html – DumbCoder

+0

@BasileStarynkevitch Trên thực tế 'std :: multiset' đã tồn tại trong C++ 98, trong khi nhận xét của bạn có vẻ như đó là tính năng C++ 11 (hoặc tôi chỉ hiểu lầm bình luận của bạn). –

Trả lời

17

Mẫu lớp std::multiset có thông số mẫu đầu tiên chỉ định loại đối tượng được lưu trữ trong bộ và thứ hai chỉ định loại của hàm so sánh. Chúng tôi có thể bỏ qua tham số mẫu thứ ba ngay bây giờ.

Tham số thứ hai, tùy chọn, B, phải triển khai strict weak ordering và được sử dụng để đặt hàng bộ/nhiều. Yêu cầu này được yêu cầu để đảm bảo sự phức tạp lôgarit của các hoạt động tra cứu phần tử. Dưới đây là một ví dụ:

struct A 
{ 
    int x; 
}; 

struct B 
{ 
    bool operator()(const A& lhs, const A& rhs) const { 
    return lhs.x < rhs.x; 
    } 
}; 

Lớp này Boperator(), có nghĩa là nó có thể được gọi là, ví dụ

B comp; 
A a1, a2; 
bool a1lessThana2 = comp(a1, a2); 

này là cần thiết cho các thiết lập/MultiSet để đặt yếu tố trong đúng vị trí, và tìm ra nếu hai yếu tố là như nhau. Nếu có một loại operator< cho loại của bạn, thông số mẫu thứ hai có thể được bỏ qua.

bool operator<(constA& lhs, const A& rhs) { return lhs.x < rhs.x; } 

Đây là một ví dụ về việc sử dụng:

int main() 
{ 
    std::multiset<A, B> m; 
    A a1, a2; 
    a1.x = 23; 
    a2.x = 100; 
    m.insert(a1); 
    m.insert(a2); 
} 
+0

@juanchopanzaCảm ơn bạn, sự giúp đỡ tuyệt vời của bạn cùng với [this] (http://en.cppreference.com/ w/cpp/container/multiset) xóa nó rất tốt! Những gì tôi vẫn không chắc chắn là: nếu tôi đặt 'multiset ', sự khác biệt về chức năng, mà không có 'B' là gì? là nó có giá trị để biết làm thế nào là 'ít <>' làm việc với các giá trị boolean để sắp xếp nội dung của multimap? Tôi có nghĩa là kiến ​​thức này có thể cần thiết cho một số ứng dụng sau này. – berndh

+1

@eco_student 'B' là một phương tiện để xác định logic bạn muốn sử dụng cho việc sắp xếp, hoặc để xác định một logic nếu không có một toán tử' hợp lệ '. Bạn có thể có các tiêu chí khác nhau để sắp xếp các phần tử của một kiểu nhất định, do đó, điều này cho phép bạn tự do quyết định tiêu chí nào sẽ sử dụng trên cơ sở cho mỗi tập hợp/nhiều lần. – juanchopanza