代码的目的是在v向量及其对应的索引中存在数字'h'时显示“是”。如果该数字不存在,则必须打印“ No”,然后打印下一个最小数字的索引,该数字正好大于该数字。
谢谢您的帮助。
//Code (1) .
cin >> h;
int lower = lower_bound(v.begin(),v.end(),h);
if(v[lower] == h) cout<<"Yes ";
else cout<<"No ";
cout << lower+1;
通过代码(1)产生了以上错误,但是当我们使用代码(2)时程序成功运行。
//Code (2).
cin >> h;
int lower = lower_bound(v.begin(),v.end(),h) - v.begin();
if(v[lower] == h) cout<<"Yes ";
else cout<<"No ";
cout << lower+1;
cout<<endl;
我们减去v.begin()会发生什么变化。
此表达式:
lower_bound(v.begin(),v.end(),h);
将iterator
返回到v
中的元素。将结果用作v
的索引将不会给出有意义的结果(即使已编译)。幸运的是,编译器给出了一个错误,但不允许您执行此操作。
另一方面,从结果中减去begin
迭代器的确给出了索引:
lower_bound(v.begin(),v.end(),h) - v.begin();
请注意,该索引可能仍然无效,无法与v
一起使用。考虑当h
大于v
中的所有元素时会发生什么。索引将等于v.size()
,在此位置索引到v
为UB。
检查是否在v
中找到元素的正确方法是与v.end()
进行比较,如下所示:
auto it = lower_bound(v.begin(),v.end(),h);
if(it != v.end())
cout << "Yes, at index " << std::distance(v.begin(), it);
else
cout<<"No ";