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

时间:2019-10-02 22:55:57

标签: c++

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

我认为类似std::all_of的二进制谓词版本可以很好地解决问题,但是我不确定它是否存在,或者不确定它会被称为什么。如果存在这样的情况,将T应用于某些执行逐元素比较的另一个函数的组合的组合也许也会起作用。


所需功能示例:

std::all_of

1 个答案:

答案 0 :(得分:3)

您可以使用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);

编辑

如果您确定容器属于同一size,则也可以这样做

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