c++

c++ 공부(algorithm)

이야기prog 2025. 3. 8. 00:21
#include <iostream>
#include <vector>
#include <algorithm>


using namespace std;
int main() {
    vector<int> v(10);
    int num = 1;
    for(auto& it: v) {
        it = num++;
    }

// std::find
    // auto iter = find(v.begin(), v.end(), 11);
    // if(iter != v.end()) {
    //     cout << *iter;
    // }

// std::find_if
    // struct Functor{
    //   bool operator()(int tmp) {
    //       return !(tmp % 11);
    //   }  
    // };
    // Functor func;
    // auto iter = find_if(v.begin(), v.end(), [](int tmp){return !(tmp % 5);});
    // if(iter != v.end()) {
    //     cout << *iter;
    // }

// std::count_if
    // struct Functor{
    //   bool operator()(int tmp) {
    //       return (tmp % 2);
    //   }  
    // };
    // int count = std::count_if(v.begin(), v.end(), Functor());
    // std::cout << count;

/* std::all_of, std::any_of, std::none_of이 있는데, 각각 모든 값이 조건에 만족하는가, 하나라도 만족하는게 있는가, 만족하는게
   없는가를 반환함 */

    // bool b = all_of(v.begin(), v.end(), [](int tmp){return tmp <= 10;}); // 모든 값이 10보다 작은가?
    // std::cout << b << std::endl;
    
    // b = any_of(v.begin(), v.end(), [](int tmp){return tmp <= 10;}); // 10보다 작은 값이 있는가?
    // std::cout << b << std::endl;

    // b = none_of(v.begin(), v.end(), [](int tmp){return tmp <= 10;}); // 10보다 작은 값이 없는가?
    // std::cout << b << std::endl;
    
    
// std::for_each 모든 값에 어떤 연산을 적용

    // for_each(v.begin(), v.end(), [](int& tmp) {tmp *= 5;});
    // for(auto& it: v)
    //     std::cout << it << std::endl;

// std::remove, std::remove_if는 지우고 싶은 값들을 지운다기 보다는 지우고 싶지 않은 값들을 앞에 저장한다. 
// 즉 [1,2,3,4,5] 에서 짝수만 지운다는 가정이면 [1,3,5,4,5] 처럼 홀수를 앞에 저장하고, 뒤에 값은 남겨둔다. 그리고
// 그 iterator를 반환한다.

    // vector<int>::iterator iter = remove_if(v.begin(), v.end(), [](int tmp) {return (tmp % 2);}); // 홀수면 제거하고 싶을 때
    v.erase(remove_if(v.begin(), v.end(), [](int tmp) {return (tmp % 2);}), v.end());
    for(auto& it: v)
        std::cout << it << std::endl;
    
    return 0;
}

remove와 remove_if를 조심해서 사용하자!

 

iterator로 순회하는 for문 내부에서 vector의 erase나 clear을 사용하면 예상치 못한 작업을 수행할 수 있음.

 

for(auto& it = v.begin(); it != v.end();) {

      if(odd) {

            it = v.erase(it); // it을 erase할 시 it이 새로운 iter을 가리키도록 해야함. 아니면 예상치 못한 동작이 작동될 수 있음.

      }

      else {

           it++;

      }

}

'c++' 카테고리의 다른 글

공부  (0) 2025.05.06
오늘 구현중 에러사항  (1) 2025.04.21
c++공부(list iterator 구현)  (0) 2025.03.07
c++ 공부(vector iterator 구현)  (0) 2025.03.06
c++ 공부  (1) 2025.03.03