gpt4 book ai didi

std::all_of() 的 C++ 二进制谓词版本?

转载 作者:行者123 更新时间:2023-11-30 02:14:19 24 4
gpt4 key购买 nike

给定两个 std::vector<T>小号,vec_avec_b , 标准库是否包含一个函数来测试 vec_a 中的每个元素小于其在 vec_b 中位置对应的元素,假设二进制 operator<T 类型的操作数定义?

我认为类似于 std::all_of 的二进制谓词版本会完美地完成这个技巧,但我不确定它是否存在,或者如果它存在会被称为什么。也许也是 std::all_of 的一些组合应用于执行按元素比较的另一个函数的输出将起作用,如果存在这样的事情。


所需功能的示例:

std::vector<int> vec_a{1, 2, 3};
std::vector<int> vec_b{2, 3, 4};

bool all_less = vec_a.size() == vec_b.size();
for (size_t i = 0; all_less && (i < vec_a.size()); ++i) {
all_less = vec_a[i] < vec_b[i];
}

// all_less now holds desired result

最佳答案

你可以使用 std::mismatch,虽然它有点难以理解(但是是一行,耶)

std::vector<int> vec_a{1, 2, 3};
std::vector<int> vec_b{2, 3, 4};

bool all_less = std::mismatch(vec_a.begin(), vec_a.end(), vec_b.begin(), vec_b.end(), std::less<>{}) == std::make_pair(vec_a.end(), vec_b.end());

您可以通过为容器而不是范围引入一个函数来帮助它一点。即

template<typename Container>
bool is_all_less(const Container& c1, const Container& c2)
{
return std::mismatch(c1.begin(), c2.end(), c1.begin(), c2.end(), std::less<>{}) == std::make_pair(c1.end(), c2.end());
}

然后

bool all_less = is_all_less(vec_a, vec_b);

编辑

如果您确定容器的大小相同,您也可以这样做

bool all_less = std::mismatch(vec_a.begin(), vec_a.end(), vec_b.begin(), std::less<>{}).first == vec_a.end();

关于std::all_of() 的 C++ 二进制谓词版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58210322/

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