2013-05-27 37 views
10

Làm cách nào để lấy phần tử tối thiểu hoặc cực đại trong vectơ cấu trúc trong C++, dựa trên một số trường trong cấu trúc?Làm thế nào để có được phần tử min hoặc max trong một vec tơ cấu trúc trong C++, dựa trên một số trường trong cấu trúc?

Ví dụ:

struct Size { 
    int width, height; 
}; 
vector<Size> sizes; 

Và bây giờ tôi muốn giải quyết mà dựa trên chiều rộng và tạo ra một vector mới cho rằng, và sau đó sắp xếp dựa trên chiều cao và tạo ra một vector mới cho điều đó.

Cảm ơn

Trả lời

7
vector<Size> sizes; 
... 
vector<Size> sortedByWidths(sizes); 
vector<Size> sortedByHeights(sizes); 
sort(sortedByWidths.begin(), sortedByWidths.end(), 
    [](Size s1, Size s2) {return s1.width < s2.width;}); 
sort(sortedByHeights.begin(), sortedByHeights.end(), 
    [](Size s1, Size s2) {return s1.height< s2.height;}); 
+0

Tôi không có ý tưởng như thế nào tất cả các câu trả lời khác bỏ qua một thực tế rằng OP muốn 2 mới vectơ, lmao –

+0

Lý do cho downvote là gì? –

16

Trong C++ 11, bạn có thể sử dụng chức năng tiêu chuẩn std::minmax_element(), được cho (một cặp vòng lặp) và có thể là một trình so sánh tùy chỉnh (cho phép bạn xác định trường dựa trên thứ tự) sẽ trả về cho bạn một trình lặp (iterator) đến mức tối thiểu và một trình lặp (iterator) tới phần tử lớn nhất, được đóng gói trong một std::pair.

Vì vậy, ví dụ:

#include <algorithm> // For std::minmax_element 
#include <tuple> // For std::tie 
#include <vector> // For std::vector 
#include <iterator> // For global begin() and end() 

std::vector<Size> sizes = { {4, 1}, {2, 3}, {1, 2} }; 

decltype(sizes)::iterator minEl, maxEl; 
std::tie(minEl, maxEl) = std::minmax_element(begin(sizes), end(sizes), 
    [] (Size const& s1, Size const& s2) 
    { 
     return s1.width < s2.width; 
    }); 

Đây là một live example.

8

Bạn có thể sử dụng std::min_elementstd::max_element với một functor phù hợp:

bool cmp(const Size& lhs, const Size& rhs) 
{ 
    return lhs.width < rhs.width; 
} 

sau đó

auto min_it = std::min_element(sizes.begin(), sizes.end(), cmp); 
auto max_it = std::max_element(sizes.begin(), sizes.end(), cmp); 

Trong C++ 11 bạn có thể thay cmp với một biểu thức lambda.

Xem thêm: std::minmax_element

3

Giải pháp sử dụng std :: minmax_element với biểu thức lambda:

#include <iostream> 
#include <vector> 

struct Size { 
    int width, height; 
}; 

int main() 
{ 
    std::vector<Size> sizes; 

    sizes.push_back({4,1}); 
    sizes.push_back({2,3}); 
    sizes.push_back({1,2}); 

    auto minmax_widths = std::minmax_element(sizes.begin(), sizes.end(), 
     [] (Size const& lhs, Size const& rhs) {return lhs.width < rhs.width;}); 
    auto minmax_heights = std::minmax_element(sizes.begin(), sizes.end(), 
     [] (Size const& lhs, Size const& rhs) {return lhs.height < rhs.height;}); 

    std::cout << "Minimum (based on width): " << minmax_widths.first->width << std::endl; 
    std::cout << "Maximum (based on width): " << minmax_widths.second->width << std::endl; 

    std::cout << "Minimum (based on height): " << minmax_heights.first->height << std::endl; 
    std::cout << "Maximum (based on height): " << minmax_heights.second->height << std::endl; 
} 
Các vấn đề liên quan