如何根据结构中的某些字段在c ++中的结构向量中获取min或max元素?

use*_*422 17 c++ c++11

如何根据结构中的某些字段在c ++中的结构向量中获取min或max元素?

例如:

struct Size {
    int width, height;
};
vector<Size> sizes;
Run Code Online (Sandbox Code Playgroud)

现在我想根据宽度求解并为其创建一个新的向量,然后根据高度进行排序并为其创建一个新的向量.

谢谢

And*_*owl 18

在C++ 11中,您可以使用std::minmax_element()标准函数(给定一对迭代器)和可能的自定义比较器(允许您定义排序所基于的字段),将返回一个迭代器到最小元素和最大元素的迭代器,打包在std::pair.

例如:

#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;
    });
Run Code Online (Sandbox Code Playgroud)

这是一个实例.


jua*_*nza 15

您可以使用std :: min_elementstd::max_element使用合适的仿函数:

bool cmp(const Size& lhs, const Size& rhs)
{
  return lhs.width < rhs.width;
}
Run Code Online (Sandbox Code Playgroud)

然后

auto min_it = std::min_element(sizes.begin(), sizes.end(), cmp);
auto max_it = std::max_element(sizes.begin(), sizes.end(), cmp);
Run Code Online (Sandbox Code Playgroud)

在C++ 11中,您可以cmp使用lambda表达式替换.

另见:std::minmax_element


Arm*_*yan 9

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;});
Run Code Online (Sandbox Code Playgroud)


Dan*_*Dan 5

使用带有 lambda 表达式的 std::minmax_element 的解决方案:

#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;
}
Run Code Online (Sandbox Code Playgroud)