operator==,!=,<,<=,>,>=,<=>(std::map)
From cppreference.com
| ヘッダ <map> で定義 |
||
| (1) | ||
| (2) | (C++20まで) | |
| (3) | (C++20まで) | |
| (4) | (C++20まで) | |
| (5) | (C++20まで) | |
| (6) | (C++20まで) | |
| (7) | (C++20以降) | |
2つのmapの内容を比較します。
1,2) lhsとrhsの内容が等しいか、すなわち、要素数が同じで、lhsの各要素がrhsの同じ位置の要素と等しいかを確認します。
3-6)
lhs と rhs の内容を辞書順で比較します。比較は std::lexicographical_compare と同等の関数によって行われます。この比較では、map の順序付け Compare は無視されます。7)
lhs と rhs の内容を辞書順で比較します。比較は、std::lexicographical_compare_three_way(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), synth-three-way) を呼び出すのと同等に行われます。この比較では、map の順序付け Compare は無視されます。 以下の条件のいずれも満たされない場合、動作は未定義です
-
Tはthree_way_comparableのモデルです。 - 型(おそらくconst修飾された)
Tの値に対して<が定義されており、<は全順序関係です。
|
|
(C++20以降) |
目次 |
[編集] パラメータ
| lhs, rhs | - | 比較するmap |
-T, Key は、オーバーロード (1,2) を使用するために EqualityComparable の要件を満たす必要があります。 | ||
-オーバーロード (3-6) を使用するために、Key は LessThanComparable の要件を満たす必要があります。順序関係は全順序を確立する必要があります。 | ||
[編集] 戻り値
1)
map の内容が等しい場合は true、そうでない場合は false。2)
map の内容が等しくない場合は true、そうでない場合は false。3) lhsの内容がrhsの内容よりも辞書的に小さい場合はtrue、そうでない場合はfalse。
4) lhsの内容がrhsの内容よりも辞書的に小さいか等しい場合はtrue、そうでない場合はfalse。
5) lhsの内容がrhsの内容よりも辞書的に大きい場合はtrue、そうでない場合はfalse。
6) lhsの内容がrhsの内容よりも辞書的に大きいか等しい場合はtrue、そうでない場合はfalse。
7) lhsとrhsに非等価な要素の最初のペアが存在する場合はその相対順序、それ以外の場合はlhs.size() <=> rhs.size()。
[編集] 計算量
1,2)
lhs と rhs のサイズが異なる場合は定数時間、それ以外の場合は map のサイズに線形時間。3-7)
map のサイズに線形時間。[編集] 備考
|
関係演算子は、要素型のoperator<を介して定義されます。 |
(C++20まで) |
|
関係演算子はsynth-three-wayを介して定義されます。synth-three-wayは、可能であればoperator<=>を使用し、そうでなければoperator<を使用します。 特に、要素自身がoperator<=>を提供しないが、三方比較可能な型に暗黙的に変換できる場合、その変換がoperator<の代わりに使用されます。 |
(C++20以降) |
[編集] 例
このコードを実行
#include <cassert> #include <compare> #include <map> int main() { std::map<int, char> a{{1, 'a'}, {2, 'b'}, {3, 'c'}}; std::map<int, char> b{{1, 'a'}, {2, 'b'}, {3, 'c'}}; std::map<int, char> c{{7, 'Z'}, {8, 'Y'}, {9, 'X'}, {10, 'W'}}; assert ("" "Compare equal containers:" && (a != b) == false && (a == b) == true && (a < b) == false && (a <= b) == true && (a > b) == false && (a >= b) == true && (a <=> b) != std::weak_ordering::less && (a <=> b) != std::weak_ordering::greater && (a <=> b) == std::weak_ordering::equivalent && (a <=> b) >= 0 && (a <=> b) <= 0 && (a <=> b) == 0 && "Compare non equal containers:" && (a != c) == true && (a == c) == false && (a < c) == true && (a <= c) == true && (a > c) == false && (a >= c) == false && (a <=> c) == std::weak_ordering::less && (a <=> c) != std::weak_ordering::equivalent && (a <=> c) != std::weak_ordering::greater && (a <=> c) < 0 && (a <=> c) != 0 && (a <=> c) <= 0 && ""); }
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3431 | C++20 | operator<=>はTを必要としませんでしたthree_way_comparableのモデルとするために |
要求するようになった |