固有の要素の与えられたstd::set< T, less >
、または入れ物。異種コンパレータです。つまり、別の型の値を type の値と比較できます。type のすべての値は一意ですが、(おそらく) typeの特定の値と同等の type の値がたくさんあります。未定義の動作ですか?std::map< T, less >
less
U
T
T
T
U
たとえば、 type の値に相当するキーを持つコンテナ内の (1 つの) 要素を見つけたいとしますU
。いずれか: 複数ある場合は、最初、最後、または中間のいずれか。u
typeの値に相当するコンテナ内に複数の要素があることを私は知っています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
andを使用する必要がありますか?std::multimap