错误:无法从'std :: __ 1 :: __ wrap_iter '转换为'int'

问题描述 投票:0回答:1

代码的目的是在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()会发生什么变化。

c++ pointers vector stl iterator
1个回答
1
投票

此表达式:

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 ";
© www.soinside.com 2019 - 2024. All rights reserved.