- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个程序:
#include <ranges>
#include <numeric>
#include <iostream>
int main() {
auto rng = std::ranges::istream_view<int>(std::cin);
std::cout << std::accumulate(std::ranges::begin(rng), std::ranges::end(rng), 0);
}
应该对标准输入流上显示为文本的所有整数求和。但是 - 它不会编译。我知道
std::ranges::begin()
和
std::ranges::end()
存在,那是怎么回事?编译器告诉我它找不到合适的候选人;怎么了?
最佳答案
从开始到 C++17,一切都在 <algorithm>
基于迭代器对:你有一个 iterator
指的是范围的开头和一个 iterator
指范围的末尾,始终具有相同的类型。
在 C++20 中,这是通用的。范围现在用 iterator
表示和一个 sentinel
对于那个迭代器 - 其中 sentinel
本身实际上不需要是任何类型的迭代器,它只需要是一种可以与其对应的迭代器进行比较的类型(这是 sentinel_for
概念)。
C++17 范围往往是†有效的 C++20 范围,但不一定是相反的方向。原因之一是能够拥有独特的 sentinel
类型,但还有其他人,这也适用于这个问题(见下文)。
为了配合新模型,C++20 在 std::ranges
中添加了大量算法。采用 iterator
的命名空间和一个 sentinel
, 而不是两个 iterator
s。例如,虽然我们一直都有:
template<class InputIterator, class T>
constexpr InputIterator find(InputIterator first, InputIterator last,
const T& value);
我们现在还有:
namespace ranges {
template<input_iterator I, sentinel_for<I> S, class T, class Proj = identity>
requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*>
constexpr I find(I first, S last, const T& value, Proj proj = {});
template<input_range R, class T, class Proj = identity>
requires indirect_binary_predicate<ranges::equal_to,
projected<iterator_t<R>, Proj>, const T*>
constexpr borrowed_iterator_t<R>
find(R&& r, const T& value, Proj proj = {});
}
这里的第一个重载需要一个
iterator
/
sentinel
对,第二个取而代之的是一个范围。
std::ranges
中加入了相应的重载,
<numeric>
中的那些被排除在外。有一个
std::accumulate
但没有
std::ranges::accumulate
.因此,我们目前唯一可用的版本是采用迭代器对的版本。否则,你可以只写:
auto rng = std::ranges::istream_view<int>(std::cin);
std::cout << std::ranges::accumulate(rng, 0);
不幸的是,
std::ranges::istream_view
是新的 C++20 范围之一,其标记类型与其迭代器类型不同,因此您不能传递
rng.begin()
和
rng.end()
进入
std::accumulate
任何一个。
std::ranges::fold
):
fold
很容易做到。 views::common
.所以你可以这样:auto rng = std::ranges::istream_view<int>(ints) | std::views::common;
std::cout << std::accumulate(rng.begin(), rng.end(), 0);
除非在这种特定情况下。
istream_view
的迭代器不可复制,在 C++17 中所有迭代器都必须是。所以实际上没有办法提供基于
istream_view
的 C++17 兼容迭代器。 .您需要适当的 C++20 范围支持。 future
std::ranges::fold
将支持仅移动 View 和仅移动迭代器,但
std::accumulate
永远不能。
关于c++ - 为什么我不能使用 istream_view 和 std::accumulate 来总结我的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65312736/
我只是在阅读有关 HQ9+ 编程语言的一些内容: https://esolangs.org/wiki/HQ9+ , https://en.wikipedia.org/wiki/HQ9+ , 和 htt
首先,我是 Mongo DB 的新手。一直在遵循一些指南和示例,例如 https://www.programcreek.com/java-api-examples/index.php?api=com.
当我写作时 long long sum = accumulate(a.begin(), a.end(), 0); 或者 long long sum = accumulate(a.begin(), a.
当我写作时 long long sum = accumulate(a.begin(), a.end(), 0); 或者 long long sum = accumulate(a.begin(), a.
我有一个关于 accumulate() 和运算符重载的问题。 我有一个类 Order 包含 private: Customer cust; std::vector vP; 和一个类 Purchase
我在 C++ 中使用 opencv 库,我正在尝试计算 vector difference 中包含的点的总和 Point 类具有 x 属性,即 float . float pointSumX(Poin
我试图将以下循环转换为 accumulate() 调用,但我失败了: total = 0 for h in heat_values: total += h total -= total
如果我像下面这样在 C++ 中使用 accumulate 函数 std::vector v2{1, 2, 3, 4, 5}; int sum = 0; std::cout values{ 1,
有没有办法按名称获取已注册的 Spark 累加器,而无需传递实际引用?期望的行为: val cnt1 = sc.longAccumulator("cnt1") val cnt2 = something
std::accumulate 的 C++ 引用没有提到 std::accumulate 可能抛出的任何异常,仍然它的定义不包含 noexcept。假设一个人使用不抛出的类型和操作,在声明为 noex
尝试“滥用”std::accumulate 算法(为什么它出现在“数字” header 中?;)) template std::string strjoin(Range&& range, Sepera
这让我很困惑,如果有人能帮助我,我将不胜感激。 (编辑:以为这是一个模板化问题,我误会了) 我想使用 gnu 的并行累积算法(存储在 #include 中)添加以下类的多个拷贝 类故意不做太多,我觉
错误似乎与 std::accumulate() 或迭代器有关,或者我是否访问了无效指针? int m = 0; std::vector v{4,-3,0,-5}; for(std::vector::i
此代码是从另一个用户问题复制而来的,我很好奇这里的 accumulate 是如何工作的。我从这段代码中得到了正确的结果,但想知道 lcm 在“累积”时采用什么参数。初始化为 A,范围之和为 b?请帮忙
如何统计满足 lower_bound(42), upper_bound(137) 的元素数量从这段代码?? accumulate(values.lower_bound(42), values.uppe
我在测试代码中使用 std::accumulate 得到了意想不到的结果。我正在尝试添加一个大的 double vector ,但由于某种原因,该值溢出了: #include #include #
我试着编写一个基本的编译时版本的std::accumulate()通过定义一个类模板,该模板将递归迭代给定范围并在每次迭代时添加元素。 在 Ubuntu 14.04 上使用 gcc 4.8.4 编译测
我刚刚写了一个小的辅助函数作为 std::accumulate 的包装: template inline auto accumulate(FwdIter begin, FwdIter end) ->
需要以下示例的更漂亮的解决方案,但需要使用 std::accumulate。 #include #include #include class Object { public: Obje
是否可以指示 Redis 累积一组操作,然后发出“publish all”命令来发布整组操作(按线性顺序)? 所以你会以某种方式设置一个标记(startpublish ?)并且缓存会累积从中接收到的所
我是一名优秀的程序员,十分优秀!