Portable:
struct SelectKey {
template <typename F, typename S>
F operator()(const std::pair<const F, S> &x) const { return x.first; }
};
std::transform(m.cbegin(), m.cend(), std::back_inserter(v), SelectKey());
Tôi nghĩ rằng một số triển khai của STL có phần mở rộng phi tiêu chuẩn gọi là select1st
, đó là tương đương với SelectKey
đưa ra ở đây. Như K-Ballo đã chỉ ra trong các bình luận, đó cũng là một phiên bản TR1. Tôi thích phiên bản được đặt tên rõ ràng vì nó dễ dàng hơn để xem những gì đang xảy ra.
Kể từ khi không có nhu cầu về nhà nước, bạn có thể nhận được ngay với một chút ít soạn sẵn bằng cách sử dụng một chức năng thực tế chứ không phải là một functor:
template <typename F, typename S>
F SelectKey()(const std::pair<const F, S> &x) { return x.first; }
std::transform(m.cbegin(), m.cend(), std::back_inserter(v), SelectKey);
Nếu bạn có thể sử dụng C++ 11, bạn có thể sử dụng một lambda, mà giữ mã lựa chọn gần nơi nó được sử dụng:
std::transform(m.cbegin(), m.cend(), std::back_inserter(v),
[](const std::pair<const F, S> &x) { return x.first; });
hoặc thậm chí phạm vi dựa trên cho vòng lặp, mà có lẽ là thanh lịch nhất và dễ đọc:
for(const auto &x : m) {
v.push_back(x.first);
}
Nguồn
2011-10-05 20:53:26
Overkill? Bạn không gõ quá nhiều dòng mã để đạt được điều này anyway. –
@Als: bởi logic đó nhiều std :: thuật toán là như nhau vô ích. –
@Mahesh - Tôi đang nghĩ về một số phép thuật phản xạ lại, hoặc một cái gì đó –