我是C++的新手,并不了解STL库的所有概念,所以请耐心等待.我编写了以下代码片段(粘贴在下面),以便在排序向量中找到lower_bound.尽管此代码在Release模式下工作正常,但它在调试模式(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;
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
至于你想要解决的问题,如果你想让值尽可能接近目标值,你真的不需要在less_equal这里使用.相反,使用lower_bound获取一个大于你正在寻找的值的最小元素的迭代器(使用<整数的默认比较),然后将该值与它之前的值进行比较(当然,假设这两个值都存在! )from lower_bound是最小元素,至少与x一样大,而该值之前的元素是不大于x的最大值,因此两者中的一个必须是最接近的.
至于为什么程序在断言,很可能是因为这<=不是一个严格的弱序,但我不能确定.更改为使用上述方法应该修复它,除非问题来自其他来源.