給定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