gpt4 book ai didi

c++ - 在类的std::vector中比较类的不同属性

转载 作者:行者123 更新时间:2023-12-02 10:05:16 24 4
gpt4 key购买 nike

我真的不知道这个名字叫什么,请忍受。

因此,假设我有一个类似的类(class):

class data {
double a;
double b;
double c;

bool is_blue;
};

然后我用它来构造 vector std::vector<data> vdata。我感兴趣的是能够根据类的给定属性比较 vector 的值。例如,我想找到 a最小的元素,或者找到 b > 2.0is_blue == true的所有元素。

我对如何实现这一点有一些想法,但它们并没有涵盖我想要的所有情况。例如,我可能可以遍历 vdata的元素,选择 a并构造一个 std::vector<double>,然后使用 std::min_element来获取最小值。或者,使用 std::find查找我想要的。

或者,也许我可以使用 std::transform和lambda并生成一个指示我的测试是否通过的 vector ,然后从中进行选择,例如:

std::vector<bool> s;
std::transform(s.begin(), s.end(), std::back_inserter(ordinals),
[](auto &d) -> bool { return d.b > 2.0 });

我还以为也许可以使用 std::sort并基本上根据自己的兴趣对 vdata进行排序。我甚至不确定这种方法是否有意义。

因此,我知道如何以不同的方式来解决这个问题,并且它们起作用了,但是我觉得我缺少了一些东西,这应该是涵盖所有情况的更好的方法。我对某些比较和最小/最大元素最感兴趣。我还可以完全控制 data类,因此,我可以自由添加它,将其封装到另一个类中,等等。

附言如果可以为这个问题选择一个更好的标题,请告诉我。

最佳答案

对于您提到的内容,可以使用标准库中的函数。您将需要 std::min_element (如您所述)和 std::partition (或 std::stable_partition )。

#include <algorithm> // min_element, partition

std::ostream& operator<<(std::ostream& os, const data& d) {
return os << '{' << d.a << ',' << d.b << ',' << d.c << ',' << d.is_blue << '}';
}
//...

std::cout << "element with smallest a\n";
auto min_it = std::min_element(vdata.begin(), vdata.end(),
[](const data& l, const data& r) { return l.a < r.a; });
std::cout << *min_it << '\n';


std::cout << "range with all b > 2.0\n";
auto pivot = std::partition(vdata.begin(), vdata.end(),
[](const data& d) { return d.b > 2.; });
for(auto it = vdata.begin(); it != pivot; ++it) {
std::cout << *it << '\n';
}


std::cout << "range with all blue\n";
pivot = std::partition(vdata.begin(), vdata.end(),
[](const data& d) { return d.is_blue; });
for(auto it = vdata.begin(); it != pivot; ++it) {
std::cout << *it << '\n';
}

I have a few ideas on how to achieve this, but they don’t cover all the cases that I want to.



针对不同场景有不同的算法。您几乎找不到涵盖所有情况的解决方案(在某些琐碎的情况下,您可以免费获得一个这样的解决方案除外)。

关于c++ - 在类的std::vector中比较类的不同属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60512792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com