5

我有以下完美的代码。

目标:给定一个数 n,找出 n 的下一个和前一个数。

基于以下示例:如果 n = 50,那么我将分别得到 60 和 40。

我可以通过使用upper_bound 获得60。但是我如何在 50 之前获得一个数字,我似乎找不到提供的算法来做到这一点。

set<int> myset;
set<int>::iterator it,itlow,itup;

for (int i=1; i<10; i++) myset.insert(i*10); // 10 20 30 40 50 60 70 80 90
itup=myset.upper_bound (50);                 // 
cout << "upper_bound at position " << (*itup) << endl;
    //output: 60

参考http://www.cplusplus.com/reference/stl/set/lower_bound/,它说upper_bound“返回一个迭代器,指向容器中不小于x的第一个元素”但我确定有指向比较小于 x的东西的其他东西。

提前致谢!:)

4

3 回答 3

6
it = myset.lower_bound(50);
--it;

当然,除非您确定集合中的元素小于 50,否则不要取消引用该迭代。你可以检查一下it == myset.begin()

于 2012-05-12T20:47:01.987 回答
1

lower_bound像 chris 所说的那样使用,请参阅 sgi: http ://www.sgi.com/tech/stl/lower_bound.html和 MSDN:http: //msdn.microsoft.com/en-us/library/awxks70z%28v=vs.80 %29.aspx

lower_bound将返回将发生插入的位置,以便保持您想要的顺序。

所以

itlow = myset.lower_bound (50); // check if this is not pointing to myset.end()
--itlow; // should still check if this is in your container really
cout << "upper_bound at position " << (*itup) << "lower bound" << (*itlow) << endl;

我认为更好的版本

// check whether lower_bound returns myset.end() or myset.begin() for sensible and safe assignment
if (myset.lower_bound(50) != myset.end() && myset.lower_bound(50) != myset.begin())
{
  itlow = myset.lower_bound(50);
  --itlow;
}
于 2012-05-12T20:46:54.977 回答
1

你想要lower_bound(49)。或者lower_bound(50)如果需要,可能会做并准备回去。

于 2012-05-12T20:49:06.343 回答