2

私は C++ の初心者で、STL ライブラリのすべての概念を理解していないので、ご容赦ください。ソートされたベクターで lower_bound を見つけるために、次のコード スニペット (下に貼り付け) を作成しました。このコードはリリース モードでは問題なく動作しますが、デバッグ モード (VStudio-8) ではアサートします。これはless_equal<int>厳密に弱い順序付けではないためだと思います。

次のスレッドから: stl の順序付け - 厳密な弱い順序付け

STLによって弱い順序付けが課されていることはある程度理解していますが、その理由はまだよくわかりません。

以下の私の場合less_equal<int>、ソートされたベクトルで特定の値に最も近い要素を見つけようとしているので、使用する必要があります。

以下のコード スニペットは有効ですか? また、それを行うより良い方法はありますか?また、正確に何が弱く、部分的な順序であるかについての洞察/参照も役立ちます。

int main() {

  vector<int> dest;
  for(int i = 0;i <6;i++) {

     dest.push_back(i);
  }

  vector<int>::iterator i = 
  std::lower_bound(dest.begin(),dest.end(),4,less_equal< int >());

  return 1;

}
4

1 に答える 1

9

SWE が与えられた場合 (これを とし<ます)、6 つの関係演算子すべてを定義できるため、 STL は厳密な弱い順序付けを使用します。

x <  y      iff     x <  y
x <= y      iff   !(y <  x)
x == y      iff   !(x <  y || y <  x)
x != y      iff    (x <  y || y <  x)
x >= y      iff   !(x <  y)
x >  y      iff     y <  x

解決しようとしている問題については、値をできるだけ目標値に近づけたい場合は、less_equalここで使用する必要はありません。むしろ、lower_bound探している値よりも大きい最小の要素へのイテレータを取得するために使用し (<整数のデフォルトの比較を使用)、その値をその前の値と比較します (もちろん、これらの値が両方とも存在すると仮定します! ) からの値lower_boundは、少なくとも x と同じ大きさの最小の要素であり、その値の前の要素は x を超えない最大の値であるため、2 つのうちの 1 つが最も近くなければなりません。

プログラムがアサートしていた理由については<=、厳密な弱い順序付けではないという事実が原因である可能性は十分にありますが、それについては確信が持てません。上記のアプローチを使用するように変更すると、問題が他の原因によるものでない限り、修正されるはずです。

于 2011-02-09T02:53:06.133 に答える