给定std::set< T, less >
或std::map< T, less >
容器中的独特元素。 less
是异构比较器。即它可以将一些另外的类型U
的值与类型T
的值进行比较。尽管T
类型的所有值都是唯一的,但是(可能)有大量值为T
的值,它们的值等于U
类型的某个特定值。它是不确定的行为?映射或设置有透明比较器和异构元素的非唯一元素
说,我想在容器中找到(一个)元素,它具有键值,相当于U
类型的值。任何一个:无论是第一个,最后一个还是其中的一个,如果多于一个。我知道,容器中有多个元素,它们相当于U
类型的值u
。我可以使用std::set::find
或std::map::find
功能吗?是未定义的行为?
实施例(在此不精确公差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);
}
}
输出(顺序通常未指定):
0.9 1 1.1
是否UB使用缔有序如上所述的独特元素的容器?
应该用std::multiset
还是std::multimap
代替?
我认为你的意思是“大量的**'U' **值等于给定的'T'” –
你的例子'less'在比较int和double时没有定义严格的弱排序。这看起来很可能是悲伤的原因。 OTOH,比较像'operator()(std :: pair lhs,double rhs){return lhs.first
@MartinBonner号完全如上所述。上面的例子说明了这种可能 – Orient