【问题标题】:error: no viable conversion from 'std::__1::__wrap_iter<int *>' to 'int'错误:没有从 'std::__1::__wrap_iter<int *>' 到 'int' 的可行转换
【发布时间】:2020-09-08 05:57:59
【问题描述】:

如果 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;

通过code(1)产生上述错误,但是当我们使用code(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 返回的内容。如果您不知道在哪里查找,那么您可以在这里查找:en.cppreference.com/w
  • @NathanOliver i 我提到了几个网站,但是,当显示我们总是用来减去 v.begin 的下限时,我没有从中得到原因。如果你能轻描淡写这个概念,那就太好了。谢谢
  • en.cppreference.com/w/cpp/algorithm/lower_bound - 看看它返回了什么; 迭代器.
  • @Jesper Juhl Yeh,我知道它返回迭代器,并且由于 'v.begin()' 也是一个迭代器,请帮助我了解当我们用另一个迭代器减去一个迭代器时会发生什么不同(lower_bound 返回的迭代器- v.begin())
  • 考虑边缘情况,例如空容器和end() 的返回。另请阅读UB

标签: c++ pointers vector stl iterator


【解决方案1】:

这个表达式:

lower_bound(v.begin(),v.end(),h);

iterator 返回到v 中的元素。将结果用作v 的索引不会给出有意义的结果(即使它编译)。幸运的是,编译器给出了一个错误并且不允许你这样做。

另一方面,从结果中减去 begin 迭代器确实会得到一个索引:

lower_bound(v.begin(),v.end(),h) - v.begin();

这个减去2个迭代器得到的值就是这些迭代器之间的距离,这是索引的另一种表达方式。

请注意,此索引可能仍无法与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 ";

【讨论】:

  • 但是当我运行代码(2)时,它运行成功并给出了正确的结果。
  • 如果返回的迭代器是v.end(),则不会。嗯,它是 UB,所以它可能看起来有效。编辑答案以解释这一点。还添加了一种更好的方法来查找 2 个迭代器之间的距离。
  • @cigien 如果你能向我介绍一下 UB,那就太好了。
  • 这不是太复杂。 UB 表示未定义的行为。一个例子是使用不在向量范围内的索引。 UB 意味着任何事情都可能发生,你不能依赖它。你甚至不能依赖它来让你的程序崩溃。如果一个程序有 UB,不管它是否给出正确的答案,都是错误的。有关详细信息,请参阅 [this]。
  • @cigien 如果我错了请纠正我,是不是 UB 因为当我们得到 'v.end()' 的差异时(这是指向容器最后一个元素旁边的迭代器)和 'v.begin()' ,它将是容器的总​​ size ,并且索引应该是最大 size - 1
猜你喜欢
  • 2021-08-20
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
相关资源
最近更新 更多