Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有透明比较器和异构意义上的非唯一元素的映射或集_C++_Stl_Containers_C++14_Heterogeneous - Fatal编程技术网

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
的某些特定值相比是相等的。这是未定义的行为吗

比如说,我想在容器中找到(一个)元素,它有键,相当于type
U
的值。任何一个:第一个、最后一个或中间的,如果不止一个。我知道,容器中有不止一个元素,它们相当于
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);
    }
}