C++ 具有透明比较器和异构意义上的非唯一元素的映射或集
给定唯一元素的C++ 具有透明比较器和异构意义上的非唯一元素的映射或集,c++,stl,containers,c++14,heterogeneous,C++,Stl,Containers,C++14,Heterogeneous,给定唯一元素的std::set或std::map容器less是异构比较器。也就是说,它可以将另一类型U的值与类型T的值进行比较。虽然类型T的所有值都是唯一的,但是(可能)有很多类型T的值,它们与类型U的某些特定值相比是相等的。这是未定义的行为吗 比如说,我想在容器中找到(一个)元素,它有键,相当于typeU的值。任何一个:第一个、最后一个或中间的,如果不止一个。我知道,容器中有不止一个元素,它们相当于u类型的值u。我可以为使用std::set::find或std::map::find函数吗?这是
std::set
或std::map
容器less
是异构比较器。也就是说,它可以将另一类型U
的值与类型T
的值进行比较。虽然类型T
的所有值都是唯一的,但是(可能)有很多类型T
的值,它们与类型U
的某些特定值相比是相等的。这是未定义的行为吗
比如说,我想在容器中找到(一个)元素,它有键,相当于typeU
的值。任何一个:第一个、最后一个或中间的,如果不止一个。我知道,容器中有不止一个元素,它们相当于u
类型的值u
。我可以为使用std::set::find
或std::map::find
函数吗?这是未定义的行为吗
示例(此处为公差0.2
)的不精确比较:
#包括
#包括
双常数eps=0.2;
无结构
{
布尔运算符()(双l,双r)常量{返回ls{0.0,0.9,1.0,1.1,2.0};
对于(自动it=s.find(1);it!=std::end(s);it=s.find(1)){
std::cout关联容器要求表前的解释性文字说明:
kl
是这样一个值,a
[sic]被分区([alg.排序])
关于c(r,kl)
,在
a
;ku
是一个值,使得a
相对于
!c(ku,r)
;ke
是一个值,使得a
是根据
到c(r,ke)
和!c(ke,r)
,其中c(r,ke)
表示!c(ke,r)
然后描述a_tran.{find,count,equal_range}(ke)
,a_tran.下限(kl)
和a_tran.上限(ku)
的行为。因此,要求如下:
- 对于
查找
、计数
和相等范围
:
- 容器中的元素必须根据
c(r,ke)
和!c(ke,r)
c(r,ke)
必须暗示!c(ke,r)
- 对于
下限
,容器中的元素必须根据c(r,kl)
进行分区
- 对于
上限
,容器中的元素必须根据!c(ku,r)
进行分区
如果您满足这些要求,那么将异构查找与容器中的多个键等效的东西一起使用并没有错。毕竟,本文中的激励示例是在名称集中查找每个姓氏为“Smith”的人。我想您的意思是“大量的U
类型的值比较等于给定的T
”您的示例less
在比较int和double时没有定义严格的弱顺序。这看起来很可能是令人悲伤的原因。OTOH,类似于操作符()(std::pair lhs,double rhs){返回lhs.first
看起来不太可能麻烦。@MartinBonner没有。正如所述。上面的例子说明了这种可能性。问题是根本性的-我现在可以开始悬赏吗?我想为好的答案赢得大量的声誉。U
和T
不需要严格的排序。它们是c一个值应该是相等的。这是允许的。比如说,如果一个人使用less
来比较,类型double
的1.1
和类型int
的1
是相等的。如果0.5
则传递性被破坏,但情况并非如此(eps==0.2
)。
#include <set>
#include <iostream>
double const eps = 0.2;
struct less
{
bool operator () (double l, double r) const { return l < r; }
using is_transparent = void;
bool operator () (int l, double r) const { return l + eps < r; }
bool operator () (double l, int r) const { return l + eps < r; }
};
int main()
{
std::set< double, less > s{0.0, 0.9, 1.0, 1.1, 2.0};
for (auto it = s.find(1); it != std::end(s); it = s.find(1)) {
std::cout << *it << ' ';
s.erase(it);
}
}