我们可以使用像 std::mismatch 这样的 C++ 标准算法而不是 for 循环来迭代两个等长序列吗?

Can we use C++ standard algorithm like std::mismatch instead of for loop for iterating over two equal length sequences?

提问人:Bharat S 提问时间:5/6/2022 更新时间:5/6/2022 访问量:110

问:

考虑两个向量:

vector<int> A = {1, 4, 3};
vector<int> B = {5, 7, 1};

给定两个向量的长度相等。
如果我需要在每个索引上逐个元素使用并执行操作,比如计算绝对差小于或等于给定值的索引数。
3

理想情况下,基于 for 循环的实现如下所示:

int cnt{0};
for(int i{0}; i < 3; i++)
        if(abs(A[i] - B[i]) <= 3)
            cnt++;    
}

但是,我很想使用标准函数来执行相同的操作。std::mismatch

int cnt{ 0 };
auto count_close_ones = [&](int const &a, int const &b) {
  if (abs(a - b) <= 3)
    cnt++;

  return true;
};
std::mismatch(A.begin(), A.end(), B.begin(), count_close_ones);

有推荐吗?一方面,我使用的是标准库函数,因此不易出错。另一方面,该名称可能具有误导性。
这个问题不是针对的,只是一个例子。我也以同样的方式迭代同一向量中的一对元素,而不是两个 for 循环。
mismatchstd::mistmatchstd::adjacent_find

一般来说,这是可取的吗?

C++ 算法 std

评论

0赞 463035818_is_not_an_ai 5/6/2022
恕我直言,如果您使用标准算法只是为了促进其循环,并且基本上可以使用迭代两个范围的任何其他算法,那么使用该算法没有任何好处。这个问题是基于意见的。
0赞 463035818_is_not_an_ai 5/6/2022
使用压缩迭代器,您可以使用std::count_if
0赞 Bharat S 5/6/2022
什么是压缩迭代器?您能提供参考吗?
0赞 463035818_is_not_an_ai 5/6/2022
stackoverflow.com/questions/8511035/......尽管对于范围,这些答案中可能没有可用的东西
0赞 Jonathan S. 5/6/2022
从 C++23 开始,有 .en.cppreference.com/w/cpp/ranges/zip_viewstd::ranges::zip_view

答: 暂无答案