STL std :: find () C ++ - PullRequest
       30

STL std :: find () C ++

1 голос
/ 26 мая 2020

В приведенном ниже коде я объявил вектор как {1,2,3,4,5}.

Используя STL std::find(), я пытаюсь найти 5 в векторе в диапазоне от arr.begin() до arr.end()-1 или От arr.begin() до arr.begin()+4, что является одним и тем же диапазоном от 1 до 4.

Но здесь для обоих итераторы возвращаются, указывая на 5. Почему это так, ведь диапазон только от 1 до 4?

#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!

Ответы [ 2 ]

4 голосов
/ 26 мая 2020

std::find просто возвращает итератор, переданный как 2-й аргумент, когда элемент не найден. Таким образом, он возвращает итераторы как arr.begin()+4 или arr.end()-1 в вашем коде.

Вы не должны сравнивать его с std::end, например

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;
1 голос
/ 26 мая 2020

Это потому, что, если std:find не находит запрошенное значение (как здесь), он возвращает конечный итератор, который вы ему даете (а не конечный итератор полного вектора), который в этом случае указывает на элемент, который вы ищете.

...