- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 C++17(标准 ISO/IEC 14882:2017(E))中,术语 已排序 和 非递减不相同:
一个序列 [first, last)
据说在非递减相对于比较器的顺序 comp
如果对于任何迭代器 it
在 [first, last)
除了 first
,条件comp(*it, *(it - 1))
(即 *it < *(it - 1)
)评估为 false
. (参见 ISO/IEC 14882:2017(E) 28.7.5 第 1035 页)
请注意,非递减不是定义为:“每当迭代器 it
和 it + 1
在 [first, last)
中时,则 *it <= *(it + 1)
”(运算符 <= 甚至不需要定义;同样适用于 operator==
)。
一个序列被称为 已排序 关于比较器 comp
如果对于任何迭代器 it
指向序列和任何非负整数 n
使得 it + n
是指向序列元素的有效迭代器,comp(*(it + n), *it)
计算结果为 false
. (参见 ISO/IEC 14882:2017(E) 28.7 p. 1028)
请注意,sorted 未定义为:“每当迭代器 it
和 it + 1
在 [first, last)
中时,*(it + 1) < *it
的计算结果为 false。”
显然,如果一个范围被排序,那么它是非递减的。 如果 比较器 comp
是 total order那么很容易看出,如果一个范围相对于 comp
没有减少然后它相对于 comp
进行排序.但如果 comp
不是总顺序,那么如果范围相对于 comp
不减少,它是否仍然一定是正确的然后它相对于 comp
进行排序?
请注意,对 comp
的唯一要求是它满足比较要求:https://en.cppreference.com/w/cpp/named_req/Compare .
特别是comp
不需要是全序(但是,该页面上描述的诱导等价类将在由 comp
诱导的顺序下形成全序)。
为什么这个问题很重要:
我没有反例,但我怀疑答案是否定的,因为否则标准为什么会区分排序和非增加的术语? (更新:答案是 是的 )。例如,使用 std::inpace_merge
, 两个输入 ranged 需要排序,但输出 range 只要求非递减(标准没有说 std::inpace_merge()
的输出范围必须排序)。
我问的原因是因为如果这不是真的,那么许多 std
的许多 STL 实现似乎会出现问题。算法。
请注意 std::is_sorted_until
在 libstdc++ 中以相同的方式实现和 libc++ ;它们本质上是这样的:
template <class ForwardIt, class Compare>
ForwardIt is_sorted_until(ForwardIt first, ForwardIt last, Compare comp)
{
if (first != last) {
ForwardIt next = first;
while (++next != last) {
if (comp(*next, *first))
return next;
first = next;
}
}
return last;
}
std::is_sorted_until()
的这些实现
找到最长的非递减范围而不是找到最长的排序范围。 标准要求
std::is_sorted_until(first, last)
(ISO/IEC 14882:2017(E) 28.7.1 p. 1031):
If
(last - first) < 2
returnslast
. Otherwise, returns the last iteratori
in[first, last)
for which the range[first, i)
is sorted.
std::is_sorted()
应定义为:
template<class ForwardIt, class Compare>
bool is_sorted(ForwardIt first, ForwardIt last, Compare comp)
{
return std::is_sorted_until(first, last, comp) == last;
}
std::is_sorted()
还检查非递减范围的定义,而不是检查排序范围的定义。
std::merge()
的输出有什么要求在标准?那么如果输出范围是
[d_first, d_last)
那么标准的要求是“范围分别满足
std::is_sorted(d_first, d_last)
或
std::is_sorted(d_first, d_last, comp)
”。 (ISO/IEC 14882:2017(E) 28.7.5 第 1035 页)
最佳答案
考虑比较器的补码,即返回相反 bool 结果的函数 !comp(x, y)
:
comp(*it, *(it - 1))
总是假的。 !comp(*it, *(it - 1))
永远是真的。 !comp
是可传递的,那么 !comp(*(it + n), *it)
也永远如此。 comp(*(it + n), *it)
总是假的,所以序列是 已排序 . comp(x, y)
必须是
strict weak ordering . “严格弱阶的补是全预阶”(
Wikipedia)是一个数学定理,全预阶是可传递的,所以
!comp
的要求性质在上述证明的第 3 步中成立。
is_sorted
的 STL 实现(仅检查相邻元素)是正确的。
关于c++ - 在 C++17 中,即使使用不是全序的比较器,非递减也一定意味着排序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59348144/
我正在尝试开发右边框/Angular 具有特定 Angular (30°) 的表格。我见过一些类似的解决方案,但它们都无法在一定程度上发挥作用。如果我想从 30° 改变到 20°,我不想花太多力气。
我是一名优秀的程序员,十分优秀!