các map
iterator sẽ cung cấp cho bạn một pair
nơi first
là chìa khóa int
và second
là giá trị của bản đồ pair
, vì vậy nếu bạn h quảng cáo một trình lặp số it
, bạn muốn tối thiểu tất cả các giá trị it->second.first
. Hàm min_element
mong đợi một hàm so sánh cho đối số thứ ba của nó, vì vậy bạn cần xây dựng hàm so sánh dự án second.first
của hai đối số của nó.
Chúng tôi sẽ bắt đầu với một số typedefs để làm cho mã dễ đọc hơn:
typedef std::pair<short, float> val_type;
typedef std::map<int, val_type> map_type;
map_type m;
Chúng ta sẽ sử dụng Boost.Lambda cho các nhà khai thác quá tải của nó, cho phép chúng ta sử dụng operator<
. Boost.Bind có thể ràng buộc các biến thành viên cũng như các hàm thành viên, vì vậy chúng ta cũng sẽ tận dụng lợi thế của nó.
#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>
using boost::bind;
// Comparison is (_1.second.first < _2.second.first)
std::cout <<
std::min_element(m.begin(), m.end(),
bind(&val_type::first, bind(&map_type::iterator::value_type::second, _1))
<
bind(&val_type::first, bind(&map_type::iterator::value_type::second, _2))
)->second.first;
Điều đó cũng sẽ hoạt động với boost::lambda::bind
.
Nguồn
2011-01-25 16:37:48
Còn được gọi là 'select1st' trong một số thư viện C++. – ephemient
@ephemient: Đúng - không biết rằng nó đã được bao gồm trong STL của SGI. Trong trường hợp đó tôi sẽ khuyên bạn nên để lại tên theo cách này bởi vì SGI hỗ trợ bất kỳ giao diện giống như cặp nào, trong khi điều này chỉ hoạt động với std :: pair. –