Numeric Range Algorithms for C++20

栏目: IT技术 · 发布时间: 5年前

内容简介:TL;DR: I’ve written C++20 range-based versions of the algorithms in theC++20 brings with it updated versions of the many, many algorithms in theThe reason for this is simply one of time. It turns out that correctly defining the concepts for the numeric alg

TL;DR: I’ve written C++20 range-based versions of the algorithms in the <numeric> header, and you can get them here

C++20 brings with it updated versions of the many, many algorithms in the <algorithm> header. Sadly, as Peter Dimov recently noted , it does not do so for the “other” algorithms in the <numeric> header.

The reason for this is simply one of time. It turns out that correctly defining the concepts for the numeric algorithms is very tricky to do, and so to avoid ranges “missing the bus” with C++20 these needed to go on the back-burner for a little while. But Christopher Di Bella is currently working on it , so I’m very hopeful we’ll see conceptified, range-based versions of accumulate() and friends in C++23.

As a stop-gap solution in the mean time, I’ve written numeric_ranges.hpp – modern implementations of the most common <numeric> algorithms which you can use with C++20 ranges. You can get it here .

These implementations simply ignore the hardest part of the problem – actually defining the numeric concepts – and so, unlike the other algorithms in the std::ranges namespace, they are unconstrained and don’t offer any protection from ugly, C++98-style template error messages when you get things wrong.

Nonetheless, they do still offer the other benefits of the std::ranges algorithms, for example:

  • They have range-based overloads (of course)
  • They accept optional projections
  • They’re constexpr -callable
  • They’re CPOs , so you can (for example) pass them to other algorithms without needing to wrap them in lambdas.
constexpr std::array arr{1, 2, 3, 4};
std::vector<int> out;

tcb::partial_sum(arr, std::back_inserter(out));
// out contains [1, 3, 6, 10]

const int prod = tcb::inner_product(arr, out, 0);
// prod = (1 * 1) + (2 * 3) + (3 * 6) + (4 * 10) = 65
assert(prod == 65);

constexpr auto sq = [](int i) { return i * i; };
constexpr int sum = tcb::accumulate(arr, 0, {}, sq);
// sum = 1 + 4 + 9 + 16 = 30
static_assert(sum == 30);

Try it out!

Not using C++20 yet?

At the time of writing the only standard library implementation of ranges comes with the brand-new GCC 10.1. Other implementations are sure to follow in due time, and when they do, numeric_ranges.hpp will work with them.

But if you’re not using C++20 or a brand new GCC yet, don’t despair! You can still use all the new ranges goodness in C++17 with NanoRange – and, of course, numeric_ranges.hpp works with NanoRange too.

Enjoy!

1 : Or rather, constrained just enough to avoid ambiguous calls, and no more.

2 : Before anyone asks, Range-V3 comes with its own implementations of these algorithms, so numeric_ranges.hpp isn’t needed there.


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java核心技术·卷 I(原书第10版)

Java核心技术·卷 I(原书第10版)

[美] 凯.S.霍斯特曼(Cay S. Horstmann) / 周立新 等 / 机械工业出版社 / 2016-9 / CNY 119.00

Java领域最有影响力和价值的著作之一,由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),与《Java编程思想》齐名,10余年全球畅销不衰,广受好评。第10版根据Java SE 8全面更新,同时修正了第9版中的不足,系统全面讲解了Java语言的核 心概念、语法、重要特性和开发方法,包含大量案例,实践性强。 一直以来,《Java核心技术》都被认为是面向高级程序员的经典教......一起来看看 《Java核心技术·卷 I(原书第10版)》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具