gpt4 book ai didi

c++ - 是否有 c++ std 解决方案来过滤和减少而不创建拷贝?

转载 作者:行者123 更新时间:2023-12-01 23:33:53 25 4
gpt4 key购买 nike

我想找到过滤列表的最小元素。在 Python 中,我会写:

it = (x for x in [1, 8, 4, 3] if x % 2 == 0)
min(it, default=None)

我希望 C++ 的等价物是这样的:

const std::vector<int> array {1, 8, 4, 3};

const auto arr_end = std::end(array);
auto it = std::find_if(std::begin(array), arr_end, [](int value) { return value % 2 == 0; });
auto jt = std::min_element(it, arr_end);

if (jt != arr_end) {
std::cout << "Min even element is: " << *jt << std::endl;
} else {
std::cout << "No even element exists!" << std::endl;
}

预期结果是4,但实际结果当然是3。原因:find_if跳到8。然后从8到结束选择min元素,也就是3。

我的问题:有没有一种方法可以创建一个遍历所有可用于查找最小元素的偶数的迭代器?我不允许使用 boost、创建拷贝或写入 array。我们使用的是 c++17。

最佳答案

自 C++17 起,std 中没有答案。在 C++20 中,您可以使用 std::ranges::filter_view,在 std 之外,您可以使用 range-v3 library 中的 ranges::filter_view ,这是 C++20 范围提案的演示实现。

auto filtered = ranges::filter_view(array, [](int value) { return value % 2 == 0; });
auto it = std::min_element(filtered.begin(), filtered.end());

if (it != filtered.end()) {
std::cout << "Min even element is: " << *jt << std::endl;
} else {
std::cout << "No even element exists!" << std::endl;
}

关于c++ - 是否有 c++ std 解决方案来过滤和减少而不创建拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65900252/

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