STL std :: find()C ++

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

在下面的代码中,我将向量声明为{1,2,3,4,5}

[使用STL std::find(),我试图在5arr.begin()arr.end()-1arr.begin()的向量中找到arr.begin()+4,该向量与从14的范围相同。

但是对于这两种情况,迭代器都返回指向5的位置。为什么会这样,因为范围仅从14

#include <iostream>
#include <vector>
#include <array>
#include <algorithm>
using namespace std;

int main () {
    vector<int> arr {1,2,3,4,5};
    // TEST
    for_each(arr.begin(), arr.begin()+4, [](const int &x) { cerr << x << " "; }); cerr << endl;
    for_each(arr.begin(), arr.end()-1, [](const int &x) { cerr << x << " "; }); cerr << endl;

    auto it1 {std::find(arr.begin(), arr.begin()+4, 5)};
    auto it2 {std::find(arr.begin(), arr.end()-1, 5)};

    if (it1 != arr.end())
        cout << *it1 << " Found!" << endl;
    else
        cout << "NOT Found!" << endl;

    if (it2 != arr.end())
        cout << *it2 << " Found!" << endl;
    else
        cout << "NOT Found!" << endl;
    return 0;
}

输出:

1 2 3 4 
1 2 3 4 
5 Found!
5 Found!
c++ algorithm stl find containers
2个回答
3
投票

std::find仅返回找不到元素时作为第二个参数传递的迭代器。因此它在您的代码中将迭代器返回为std::findarr.begin()+4

您不应将其与arr.end()-1进行比较,例如

std::end

1
投票

这是因为,如果if (it1 != arr.begin()+4) cout << *it1 << " Found!" << endl; else cout << "NOT Found!" << endl; if (it2 != arr.end()-1) cout << *it2 << " Found!" << endl; else cout << "NOT Found!" << endl; 找不到请求的值(如此处所示),它将返回您赋予它的结束迭代器(而不是完整向量的结束迭代器),在这种情况下,它指向元素您正在寻找。

© www.soinside.com 2019 - 2024. All rights reserved.