我对C ++很陌生,并且不了解STL库的所有概念,所以请耐心等待。
我编写了以下代码片段(粘贴在下面),以便在排序向量中找到lower_bound。
尽管此代码在Release模式下工作正常,但它在调试模式(VStudio-8)中断言。
我相信这是因为less_equal<int>
不是严格的弱序。
来自以下主题:stl ordering - strict weak ordering
我确实理解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;
}
答案 0 :(得分:9)
STL使用严格的弱排序,因为给定一个SWE(让我们表示它<
),你可以定义所有六个关系运算符:
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的最大值,因此两个中的一个必须是最接近的。
至于为什么程序在断言,很可能是因为<=
不是严格的弱序,但我无法确定。更改为使用上述方法应该修复它,除非问题来自其他来源。