std::less<Pointer> 的严格总顺序
strict total order of std::less<Pointer>
本题来自:
If you have say two vectors a and b, the total order is permitted to be &a[0], &b[0], &a[1], &b[1], &a[2], &b[2], ..., i.e., with the elements interleaved.
允许这样的顺序吗?
我对标准了解不多。如果我只阅读与 std::less
.
直接相关的部分,那似乎是正确的
而且我发现Herb Sutter的gcpp库也有类似的用法(link):
// Return whether p points into this page's storage and is allocated.
//
inline
bool gpage::contains(gsl::not_null<const byte*> p) const noexcept {
// Use std::less<> to compare (possibly unrelated) pointers portably
auto const cmp = std::less<>{};
auto const ext = extent();
return !cmp(p, ext.data()) && cmp(p, ext.data() + ext.size());
}
是的,不同的数组(不属于同一个完整对象的一部分)可以在排序中交错,但每个数组必须单独正确排序——这就是它表示全序必须与内置算子建立的偏序一致。 a+1
指向紧跟在 *a
之后的元素这一事实与不相关数组的问题无关,因为偏序正是索引和指针顺序之间的明显关系属于 one 完整的对象。 (事实上 ,“紧接着”在这里是循环的,因为唯一可观察到的即时性在数组索引本身中。整数转换不需要遵守它,所以你看不到“真实地址”。)
本题来自
If you have say two vectors a and b, the total order is permitted to be &a[0], &b[0], &a[1], &b[1], &a[2], &b[2], ..., i.e., with the elements interleaved.
允许这样的顺序吗?
我对标准了解不多。如果我只阅读与 std::less
.
而且我发现Herb Sutter的gcpp库也有类似的用法(link):
// Return whether p points into this page's storage and is allocated.
//
inline
bool gpage::contains(gsl::not_null<const byte*> p) const noexcept {
// Use std::less<> to compare (possibly unrelated) pointers portably
auto const cmp = std::less<>{};
auto const ext = extent();
return !cmp(p, ext.data()) && cmp(p, ext.data() + ext.size());
}
是的,不同的数组(不属于同一个完整对象的一部分)可以在排序中交错,但每个数组必须单独正确排序——这就是它表示全序必须与内置算子建立的偏序一致。 a+1
指向紧跟在 *a
之后的元素这一事实与不相关数组的问题无关,因为偏序正是索引和指针顺序之间的明显关系属于 one 完整的对象。 (事实上 ,“紧接着”在这里是循环的,因为唯一可观察到的即时性在数组索引本身中。整数转换不需要遵守它,所以你看不到“真实地址”。)