C++ Vector 값 탐색 find - 존재 유무 확인

Notepad96

·

2020. 11. 12. 21:55

300x250

 

 

 

1. find, find_if

 

vector에서 특정 데이터가 존재하는지 확인하고 싶다.

 

그렇다면 algorithm 라이브러리의 find를 사용할 수 있다.

 

find는 반복자를 인자로 갖으면서 배열, vector, deque 처럼 일련의 데이터 구조에서 특정 데이터가 존재하는 확인할 수 있다.

 

또한, find_if를 사용하면 특정 조건에 일치하는 데이터를 탐색할 수 있다.

 

 

 

 


2. 코 드

환경 : Visual studio 2019
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

bool isOdd(int n) {
    return n % 2 == 1;
}

int main() {
    vector<int> v;
    v.push_back(46);
    v.push_back(67);
    v.push_back(184);
    v.push_back(4);
    v.push_back(17);
    v.push_back(53);
    
    cout << "현재 vector : ";
    for (int i : v) cout << i << " ";
    cout << "\n==============================\n";


    int num = 4;
    auto it = find(v.begin(), v.end(), num);
    if (it == v.end()) {
        cout << num << "은 찾을 수 없습니다.\n";
    }
    else {
        cout << num << "는 존재하며 인덱스는 " << it - v.begin() << " 입니다.\n";
    }
    cout << "\n==============================\n";


    cout << "홀수(Odd)들 \n";
    auto it2 = find_if(v.begin() , v.end(), isOdd);
    while (it2 != v.end()) {
        cout << *it2 << "\n";
        it2 = find_if(it2+1, v.end(), isOdd);
    }

    return 0;
}
 
결과

 

 
 
- find는 인자로 탐색할 범위와 탐색할 원소를 받는다.
 
 
해당 원소를 찾으면 해당 원소의 반복자를 반환해주며 존재하지 않으면 해당 범위의 마지막 end() 반복자를 반환한다.
 
 
 
반환받은 반복자를 시작 반환자인 begin()을 빼줌으로서 위치(인덱스)를 구할 수 있다.
 
 
 
 
 
 
 
- find_if는 특정 조건에 일치하는 원소를 탐색한다.
 
 
isOdd 함수는 홀수인 경우 true 그렇지 않다면 false를 리턴한다
 
 
 
이를 while문과 사용함으로써 해당 vector에서 존재하는 조건을 만족하는(홀수) 원소를 모두 찾아낼 수 있다.
 
 
 
 
 


3. 참 조

 
 
 

find - C++ Reference

123456789 template InputIterator find (InputIterator first, InputIterator last, const T& val) { while (first!=last) { if (*first==val) return first; ++first; } return last; }

www.cplusplus.com

 

 

 

find_if - C++ Reference

123456789 template InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred) { while (first!=last) { if (pred(*first)) return first; ++first; } return last; }

www.cplusplus.com

 

 

 

300x250