热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

应该set::equal_range()返回pair(set::lower_bound(),set::upper_bound())

是的,我知道,我应该有一个复制品,但复制品制作起来很烦人。在我制作一个(可能会给clang一个错误)之前,我想确保我对事情应该如何工作的理解是正确的。

是的,我知道,我应该有一个复制品,但复制品制作起来很烦人。在我制作一个(可能会给 clang 一个错误)之前,我想确保我对事情应该如何工作的理解是正确的。


  • MSVC:返回set::equal_range(){lower_bound(),upper_bound()}


  • Clang:返回set::equal_range(){lower_bound(),upper_bound()-1}。(使用 stdlib=libc++)——当然还有我的例子。


我对 STL 编程过去 20 年的期望是 MSVC 是正确的。事实上,我正在编辑的代码是我 20 年前写的,它曾经在 clang 和 gcc 中工作,但现在只能在 MSVC 中工作(也许 gcc - 我还没有尝试过 - 我正在使用一些标题C++20 并且仅在 stdlib=libc++ 和 MSVC 中,但不在 gcc 中)。

无论如何,我对set::equal_range()应该返回什么的假设是否正确?

好吧,检查一下:

带有 -stdlib=libc++ 的 Clang:https ://godbolt.org/z/xfnasKa73

没有 -stdlib=libc++ 的 Clang:https ://godbolt.org/z/5qYEj4MEd

如果您认为我的比较器是假的,请告诉我。

下面是测试代码:

#include
#include
#include
using namespace std;
struct Range : public pair
{
using pair::pair;
bool operator <( Range const & _r ) const
{
return second <_r.first;
}
};
typedef set vTySet;
int
main()
{
vTySet setRanges = {{0,0},{9,9},{10,10},{13,13},{32,32},{34,34},{61,61},{65,90},{101,101},{110,110}};
Range rngTest = { 97, 122 };
pair pritEqualRange = setRanges.equal_range( rngTest );
size_t nDistEqualRange = distance( pritEqualRange.first, pritEqualRange.second );
pair pritLowerUpper = { setRanges.lower_bound( rngTest ), setRanges.upper_bound( rngTest ) };
size_t nDistLowerUpper = distance( pritLowerUpper.first, pritLowerUpper.second );
cout <<"nDistEqualRange:" < cout <<"nDistLowerUpper:" <}

回答

用于的任何自定义比较器std::set都应满足比较要求(严格弱排序 + 等价)。您的代码中有 UB,您看到的差异是该 UB 的结果。在您的示例中,元素是成对的(a, b),比较器(我们称之为less)是(a, b) <(c, d)iff b

考虑两对(5, 2)(6, 3)。不对称性要求如果(5, 2) <(6, 3)为真,(6, 3) <(5, 2)则应为假。但这也是事实:

Range r1(5, 2);
Range r2(6, 3);
std::cout <std::cout <

等价关系的传递性也被这样的比较器破坏:

Range r1(1, 3);
Range r2(2, 5);
Range r3(4, 6);
std::cout <std::cout <std::cout <

演示

需要注意的是,这些要求不仅适用于集合中的元素,还适用于您作为键传递给 的那些元素std::set::equal_range(const Key&)






推荐阅读
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有