Strict Weak Ordering
3483 ワード
Runtimeエラー
ソートに関する問題(質問リンク)を解決するために、ソート関数を記述する際に、奇妙にRuntimeエラーが発生したため、理由を調べ、ソート関数を記述する際には、Strict弱Orderingルールを守らなければならない.
Strict flak Orderingは、特定の値に対してサイズ関係を規定する際に矛盾する可能性がある場合と、それを防止するために守らなければならないルールに関する.
したがって,検索した内容に基づいてコードを修正して一度コミットすると,Runtimeエラーの問題が本当に消えていることがわかる.
<エラーコード>
確かに、このように計算すると、私のコードのように条件を離れると、最終的にtrueにまとめられたコードはStrict Weak Orderingルールに違反しやすい環境になるようです.
当初はreturn値に直接trueとfalseを指定するよりも,不等号演算に直接return値を指定し,計算判断をコンピュータに渡した.
Strict Weak Ordering
Strict Weak Orderingは数学の順序論における様々な規則とその形式に関する内容である.
2つの数に関する比較関数を記述する際には厳格なWeak Orderingを守らなければならない.これは最終的に順序論でいう規則を守らなければならないことを意味し、矛盾を生じないようにしなければならない.
Strict Weak Orderingが言う条件ルールは全部で4種類あります.
どの値a,b,cに対して
1)comp(a,a)はfalseを返す
-->a>aはtrueで矛盾しています
2)comp(a,b)=trueの場合、comp(b,a)はfalseを返す
-->a>bはtrue,b>aはtrueと矛盾する
3)comp(a,b)=true,comp(b,c)=true,comp(a,c)はtrueを返す
-->a>b,b>cはtrue,a>cはfalseは矛盾している
4)comp(a,b)=false,comp(b,a)=false,comp(y,c)=false,comp(c,y)=false,comp(a,c,a)もfalseに戻る
-->a>bはfalse、b>aはfalseはa=bを表す
すなわちa=b,b=c,a!=cになるのは矛盾する
上記条件によれば、aとbの値が同じ場合(Case comp(a,a)はfalseを返さなければならない.
しかし、私の最初のランタイムエラーコードから、aとbの値が同じであれば、if条件から離れてtrueを返す場合があることがわかります.
この点には矛盾と誤りがある.
Compare関数雑談
C++sort関数が受け入れるカスタムCompare関数は,戻り値がtrueの場合,最初のパラメータが2番目のパラメータより優先されると考えられる.
(すなわち、return a>bの場合、aがbより大きいと常にtrueが返されるので、aはbより前に降順を表す)
(例えば、aを5、bを3とすると、return 5>3となるので、return値はtrueとなるので、第1のパラメータ5は、3より前、すなわち5.3の順に並べ替えられると判断され、これは降順となる)
(リファレンスソース)
https://www.boost.org/sgi/stl/StrictWeakOrdering.html
https://panty.run/strict-weak-ordering/
ソートに関する問題(質問リンク)を解決するために、ソート関数を記述する際に、奇妙にRuntimeエラーが発生したため、理由を調べ、ソート関数を記述する際には、Strict弱Orderingルールを守らなければならない.
Strict flak Orderingは、特定の値に対してサイズ関係を規定する際に矛盾する可能性がある場合と、それを防止するために守らなければならないルールに関する.
したがって,検索した内容に基づいてコードを修正して一度コミットすると,Runtimeエラーの問題が本当に消えていることがわかる.
<エラーコード>
bool compare(vector<int> &a, vector<int> &b) {
if(a[0] < b[0]) return false;
else if(a[0] == b[0]){
if(a[1] < b[1]) return false;
else if(a[1] == b[1]) {
if(a[2] < b[2]) return false;
else if(a[2] == b[2]) {
if(a[3] != K) return false;
}
}
}
return true;
}
<修正されたコード>bool compare(vector<int> &a, vector<int> &b) {
if(a[0] > b[0]) return true;
else if(a[0] == b[0]){
if(a[1] > b[1]) return true;
else if(a[1] == b[1]) {
if(a[2] > b[2]) return true;
else if(a[2] == b[2]) {
if(a[3] == K) return true;
}
}
}
return false;
}
最初にエラーが発生したコードはif文条件から離れるとすべてtrueに帰結し,この過程でStrict Weak Ordering規則に違反する場合があった.確かに、このように計算すると、私のコードのように条件を離れると、最終的にtrueにまとめられたコードはStrict Weak Orderingルールに違反しやすい環境になるようです.
当初はreturn値に直接trueとfalseを指定するよりも,不等号演算に直接return値を指定し,計算判断をコンピュータに渡した.
Strict Weak Ordering
Strict Weak Orderingは数学の順序論における様々な規則とその形式に関する内容である.
2つの数に関する比較関数を記述する際には厳格なWeak Orderingを守らなければならない.これは最終的に順序論でいう規則を守らなければならないことを意味し、矛盾を生じないようにしなければならない.
Strict Weak Orderingが言う条件ルールは全部で4種類あります.
どの値a,b,cに対して
1)comp(a,a)はfalseを返す
-->a>aはtrueで矛盾しています
2)comp(a,b)=trueの場合、comp(b,a)はfalseを返す
-->a>bはtrue,b>aはtrueと矛盾する
3)comp(a,b)=true,comp(b,c)=true,comp(a,c)はtrueを返す
-->a>b,b>cはtrue,a>cはfalseは矛盾している
4)comp(a,b)=false,comp(b,a)=false,comp(y,c)=false,comp(c,y)=false,comp(a,c,a)もfalseに戻る
-->a>bはfalse、b>aはfalseはa=bを表す
すなわちa=b,b=c,a!=cになるのは矛盾する
上記条件によれば、aとbの値が同じ場合(Case comp(a,a)はfalseを返さなければならない.
しかし、私の最初のランタイムエラーコードから、aとbの値が同じであれば、if条件から離れてtrueを返す場合があることがわかります.
この点には矛盾と誤りがある.
Compare関数雑談
C++sort関数が受け入れるカスタムCompare関数は,戻り値がtrueの場合,最初のパラメータが2番目のパラメータより優先されると考えられる.
(すなわち、return a>bの場合、aがbより大きいと常にtrueが返されるので、aはbより前に降順を表す)
(例えば、aを5、bを3とすると、return 5>3となるので、return値はtrueとなるので、第1のパラメータ5は、3より前、すなわち5.3の順に並べ替えられると判断され、これは降順となる)
(リファレンスソース)
https://www.boost.org/sgi/stl/StrictWeakOrdering.html
https://panty.run/strict-weak-ordering/
Reference
この問題について(Strict Weak Ordering), 我々は、より多くの情報をここで見つけました https://velog.io/@dlsghl92/Strict-Weak-Orderingテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol