- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据 [alg.clamp#5] , 时间复杂度为 std::ranges::clamp
最多需要 2 次比较和 3 预测应用。 cppreference 中的可能实现由:
struct clamp_fn {
template<class T, class Proj = std::identity,
std::indirect_strict_weak_order<std::projected<const T*, Proj>> Comp = ranges::less>
constexpr const T& operator()(const T& v, const T& lo, const T& hi,
Comp comp = {}, Proj proj = {}) const
{
assert(!std::invoke(comp, std::invoke(proj, hi), std::invoke(proj, lo)));
return std::invoke(comp, std::invoke(proj, v), std::invoke(proj, lo)) ? lo
: std::invoke(comp, std::invoke(proj, hi), std::invoke(proj, v)) ? hi : v;
}
};
inline constexpr clamp_fn clamp;
这显然不符合要求,因为它涉及3次比较和6投影。即使我们注释掉 assert
, 投影的数量仍然是 4 因为 std::invoke(proj, v)
被执行了两次。
我能想到的唯一办法就是把std::invoke(proj, v)
的结果暂存起来, 然后传递给接下来的两个 comp
调用,就像 libstdc++做:
auto&& __proj_val = std::__invoke(__proj, __val);
if (std::__invoke(__comp, __proj_val, std::__invoke(__proj, __lo)))
return __lo;
else if (std::__invoke(__comp, std::__invoke(__proj, __hi), __proj_val))
return __hi;
else
return __val;
但是为了安全,我们好像不能用std::forward<decltype(__proj_val)>(__proj_val)
完美转发__proj_val
在第一个comp
调用,这意味着我们似乎无法使用仅 3 投影来完美实现std::ranges::clamp
.
为什么 std::ranges::clamp
如此严格地限制投影数量?这是否意味着为了复杂度的要求,需要将投影的结果暂存起来呢?还是我对这种复杂性要求的理解有误?
最佳答案
这是非常有意的。在 LWG 审查布拉格的论文期间,我特别询问了这种复杂性要求,因为它禁止“显而易见”的实现。是的,这需要实现调用值的投影并使用 auto&&
“将结果悬停在半空中”或等效的。
它还需要完美转发投影值(libstdc++ 做不到)。这是有效的,因为 invoke
要求表达式不修改其参数(来自 regular_invocable
的要求),并且是必需的,因为 indirect_strict_weak_order
中没有任何内容需要调用 iter_reference_t<I1>&
, 只有 iter_reference_t<I1>
和 iter_value_t<I1>&
.
关于c++ - 为什么 `std::ranges::clamp`会如此严格地限制投影数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67348059/
Julia 有 two methods for limiting variables to ranges of numbers : clamp 和 clamp!。使用点表示法,clamp. 也可以用于
我正在使用 Rust 和 WebAssembly 操作像素数据,并且正在努力使用操作的像素创建新的 ImageData。 当我得到我的 ImageData 时的数据,它返回 Clamped> f
我访问了这个问题的问题: Android SAX parser not getting full text from between tags因为我有类似的问题。我用这一侧的一项陈述解决了我的问题,但
我在开发的游戏中使用 Mathhelper.Clamp 时遇到了问题。这是导致我出现问题的代码片段: if (background.position.Y == 0) { player.posi
我正在放大一个元素并尝试更改 -webkit-line-clamp。它的工作原理是它在更改后显示了正确的行数,但它不起作用的原因是省略号和链接(在文本之后)没有移动到(新)末尾。 查看CodePen
我想对二维数组上的 PyTorch 张量执行类似于 np.clip 的操作。更具体地说,我想将每一列剪裁在特定的值范围内(依赖于列)。例如,在 numpy 中,你可以这样做: x = np.array
我正在编写一个表示 LED 的类。 r、g 和 b 的基本 3 个 uint 值在 0 到 255 范围内。 我是 C# 的新手,从 uint1 开始,它比我想要的 8 位大。在编写自己的 Clamp
给定: let a = 4.2 let b = -1.3 let c = 6.4 我想知道将这些值限制在给定范围内的最简单、最快捷的方法,比如 0...5,这样: a -> 4.2 b -> 0 c
我很想使用 CSS 中的 clamp 函数实现流畅的字母间距。但是因为我喜欢我的字母间距很紧,所以我需要在公式中包含三个负值,并且现在尝试了几个小时来弄清楚这个。我是否必须切换最小值和最大值,因为它们
我正在使用 -webkit-line-clamp 属性来在 Chrome 上实现多行省略号。我们已经适本地设置了高度和最大高度,以便我们看到准确的 N 行和正确的省略号。但是,一旦我们在浏览器中放大或
我正在开发一个在 z 轴上旋转对象的游戏。我需要将总旋转限制为 80 度。我尝试了以下代码,但它不起作用。 minAngle = -40.0f 和 maxAngle = 40.0f Vector3 p
给定 1 到 16 之间的精度 p,我想将 AVX2 整数寄存器限制在 -p/2 和 p/2 之间>。我目前使用 std::clamp 对非 AVX2 整数执行此操作。 有没有办法用 AVX2 做到这
给定 1 到 16 之间的精度 p,我想将 AVX2 整数寄存器限制在 -p/2 和 p/2 之间>。我目前使用 std::clamp 对非 AVX2 整数执行此操作。 有没有办法用 AVX2 做到这
我在它们之间显式转换了类型,但错误仍然存在 var destX:CGFloat = 5.0 func clamp(value: CGFloat, min: CGFloat, max: CGFl
我有一个 Vector2 变量,其中 vector.x 和 vector.y 已被限制,因此两者都只允许有 0 到 4 之间的值。显然,这使我在坐标 2 周围有一个二次空间,2 到移动游戏对象。但我想
VS2015 不会编译我的代码,说命名空间“std”没有成员“clamp”,尽管 intellisense 可以很好地识别它并告诉我参数和返回值。是的,我已经包含了标题。 #include #inc
我在 PHP 中编写了一个函数来“钳制”数字,但我想知道该函数是否在该语言中原生存在。 我在数学部分阅读了 PHP.net 文档,但找不到。 基本上我的函数所做的是它接受一个变量、一个可能值的数组和一
我正在尝试制作一个可重用的 React text-clamp 组件。用户传入要呈现的行数和他们想要显示的文本,然后组件呈现他们的文本,在指定的行数处将其 chop 并在末尾插入省略号 (...)。 我
为什么 -webkit-line-clamp 没有使用 text-align:justify 显示正确的省略号。它与 text-align:left/right 一起工作良好。 请提出任何技巧。 di
我有链接 some really long text 和这个 CSS .module { width: 250px; overflow: hidden; } .line-clamp
我是一名优秀的程序员,十分优秀!