【问题标题】:find function in c++ for a vector在 C++ 中查找向量的函数
【发布时间】:2014-08-16 20:33:54
【问题描述】:

好的,所以我是新手,我无法理解这一点。

我编写了这段代码,

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main (void)
{
    vector <int> a;
    int i;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    a.push_back(4);
    a.push_back(5);

    vector <int>::iterator position = find(a.begin(),a.end(),6);
    cout<<*position<<"\n";
    return 0;
}

我到处都读到find 函数如果没有找到任何东西会将迭代器返回到向量的末尾。因此,当我这样做并搜索向量中不存在的值6 时,它应该将迭代器返回到向量的末尾,实际上是5。在打印实际值时,它应该打印5,但它会打印0。为什么如果 find 在向量中没有找到与该值相关的任何内容,它会将迭代器返回到最后一个值,那么它会打印 0

【问题讨论】:

  • 它返回你传入的结尾,即a.end()。取消引用 a.end() 是未定义的行为。
  • "t 应该将迭代器返回到向量的末尾,实际上是 5" - 不,不是,您需要阅读 std::vector::end() 的文档。另外,您认为将迭代器返回到最后一个元素是否有意义?那么如何区分“未找到”和“在最后位置找到”?
  • 对不起,我无法区分。我的错。正如我所说,我对此并不陌生。我无法正确理解。

标签: c++ vector


【解决方案1】:

不,它不会返回向量的结尾它会返回vector.end()

前者表示向量的最后一个元素,即 5。

后者vector.end()past the end of the vector

这增加了一些混乱,因为vector.begin() 确实指向向量的第一个元素,但由于您可以迭代这些容器的方式,这是必要的。

【讨论】:

  • 哦!我现在明白了。谢谢您的帮助。 :)
  • @user3776323 如果是您需要的答案,请务必接受。
【解决方案2】:

为什么如果 find 没有在向量中找到与该值相关的任何内容,则将迭代器返回到最后一个值,然后打印 0

0 是在取消引用向量的结束迭代器时得到的垃圾值。这是未定义的行为,因此您可能会得到任何数字。正确的代码如下所示:

vector <int>::iterator position = find(a.begin(),a.end(),6);
if (position != a.end()) {
    cout<<*position<<"\n";
} else {
    cout << "not found" << endl;
}

获得结果后,需要将其与a.end() 进行比较以查看结果是否有效。如果结果无效,则不能取消对迭代器的引用以避免未定义的行为。

【讨论】:

    【解决方案3】:

    正如您在the documentation for vector::end() 中看到的,end() 迭代器与向量中的最后一个元素不同。相反,它超过了最后一个元素。访问该元素会导致未定义的行为。

    【讨论】:

      猜你喜欢
      • 2019-04-26
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 2020-08-22
      • 2020-12-17
      • 2013-07-10
      • 2011-07-23
      相关资源
      最近更新 更多