std::less<Pointer>严格全序是否允许不同vector元素地址交错排列?
问题解答
核心结论
你提到的两个vector元素地址交错的排列规则,完全符合C++标准对std::less<Pointer>的严格全序要求。
标准规则说明
- C++标准对
std::less的指针比较,只要求必须实现满足数学定义的严格全序,核心约束只有四个:非自反、非对称、传递性、等价元素排序结果一致,没有对全序的具体实现逻辑做任何限制。 - 对于指向不同分配块、没有关联的指针,标准完全没有规定它们的相对排序位置,只要实现的规则符合严格全序的要求即可。你描述的两类vector元素地址交错排列的情况,完全是标准允许的合法实现。
示例代码合法性解释
你贴出的gcpp库中的contains函数逻辑是完全安全可移植的,不会受不同分配块指针交错排序的影响:
对于同一块连续分配内存内的指针,C++标准明确规定直接使用
<比较的结果和内存地址递增的顺序完全匹配,而std::less对同一块内存内指针的比较结果,和直接用<比较的结果完全一致。
也就是说,不管其他无关指针在全序中的位置怎么穿插,同一个连续内存块内的指针相对顺序是固定的,必然满足ext.data() < ext.data()+1 < ... < ext.data() + ext.size(),因此用!std::less()(p, ext.data()) && std::less()(p, ext.data() + ext.size())判断指针落在区间内的逻辑完全正确。
内容的提问来源于stack exchange,提问作者VainMan
相关产品推荐
相关产品推荐

