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

Apo*_*ica 5 c++

给定两个std::vector<T>s 和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
Run Code Online (Sandbox Code Playgroud)

Zer*_*ges 4

您可以使用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());
Run Code Online (Sandbox Code Playgroud)

您可以通过引入容器函数而不是范围函数来帮助它。IE

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

进而

bool all_less = is_all_less(vec_a, vec_b);
Run Code Online (Sandbox Code Playgroud)

编辑

如果你确定容器是相同的size,你也可以这样做

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

  • 我不确定 145 个字符在任何合理的代码风格下是否可以作为一行,哈哈。(但你确实找到了标准库函数来回答我的问题!) (4认同)