gpt4 book ai didi

c++ - 一种按索引过滤范围,仅从过滤后的索引中获取 min_element 的方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:16:01 25 4
gpt4 key购买 nike

在这个问题的评论中is-there-a-way-to-iterate-over-at-most-n-elements-using-range-based-for-loop还有一个问题 - 是否可以在容器上使用“索引 View ”,即过滤掉一些索引的子范围。

此外,我遇到了一个问题,即从一个范围内找到最小值,并过滤掉了一些索引。

即是否可以用 std 和/或 boost 算法、过滤器替换如下代码,以使其更具可读性和可维护性:

template <typename Range, typename IndexPredicate>
auto findMin(const Range& range, IndexPredicate ipred)
-> boost::optional<typename Range::value_type>
{
bool found = false;
typename Range::value_type minValue{};
for (std::size_t i = 0; i < range.size(); ++i)
{
if (not ipred(i))
continue;
if (not found)
{
minValue = range[i];
found = true;
}
else if (minValue > range[i])
{
minValue = range[i];
}
}
if (found)
{
return minValue;
}
else
{
return boost::none;
}
}

只是这样使用:

#include <iostream>
#include <vector>

int main() {
std::vector<float> ff = {1.2,-1.2,2.3,-2.3};
auto onlyEvenIndex = [](auto i){ return (i&1) == 0;};

auto minValue = findMin(ff, onlyEvenIndex);
std::cout << *minValue << std::endl;
}

最佳答案

使用最近的标准 range-v3 proposal :

#include <range/v3/all.hpp>
#include <iostream>
#include <vector>

int main()
{
std::vector<float> rng = {1.2,-1.2,2.3,-2.3};

auto even_indices =
ranges::view::iota(0ul, rng.size()) |
ranges::view::filter([](auto i) { return !(i & 1); })
;
auto min_ind = *ranges::min_element(
even_indices, [&rng](auto L, auto R) {
return rng[L] < rng[R];
});
std::cout << rng[min_ind];
}

Live Example .请注意,语法与 Boost.Range 大致相似,但经过全面修改以利用 C++14(广义 lambda、自动返回类型推导等)

关于c++ - 一种按索引过滤范围,仅从过滤后的索引中获取 min_element 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30976131/

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