STL::algorithm

강한친구·2022년 3월 6일

C / CPP

목록 보기
14/19

컨테이너들로 작업을 도와주는

그런 기능을 수행한다.

정렬

  • sort = 일반적인 정렬
  • stable_sort= 안정적인 정렬(정렬해도 순서는 유지댐)
  • partial_sort = 부분정렬
#include <algorithm>
#include <iostream>
#include <vector>

template <typename Iter>
void print(Iter begin, Iter end) {
    while (begin != end) {
        std::cout << *begin << " ";
        begin++;
    }
    std::cout << std::endl;
}
int main() {
    std::vector<int> vec;
    vec.push_back(5);
    vec.push_back(3);
    vec.push_back(1);
    vec.push_back(6);
    vec.push_back(4);
    vec.push_back(7);
    vec.push_back(2);

    std::cout << "Before Sorting ----" << std::endl;
    print(vec.begin(), vec.end());
    std::sort(vec.begin(), vec.end());

    std::cout << "After Sorting ----" << std::endl;
    print(vec.begin(), vec.end());
    }

sort는 begin(), end()를 인자로 받아서 작동하는데, 리스트는 이렇게 정렬 할 수 없다. 이는 sort의 반복자가 임의접근 반복자(RandomAccessIteraotr를 만족해야하기 때문이다.)

partial sorting

부분정렬은

std::partial_sort(start, middle, end);

총 3개의 인자를 받는다. start 에서 end 까지중, middle까지만 정렬한다는 의미이다.

remove

물론 erase로 지우는것을 이미 알고있지만, 이는 모든 1을 지우시오같은 조건문을 수행하기는 조금 어렵다.

물론 이러한 조건도 itr을 통한 삭제, 혹은 배열처럼 접근해서 삭제를 구현할 수는 있지만, 이는 제약조건이 따른다.
하지만 remove를 쓴다면 모든게 간편해진다.

std::remove(start, end, val)

위과 같은 구조를 가지는 remove이다.

혹은 remove_if 를 통해 조건삭제를 할 수 있다.

std::remove(start, condition, end)

// ex
// std::remove(vec.begin(), is_even(), vec.end())

위와 같은 구조를 가지고있다.

transform

순회하면서조건에 따라 값을 바꾸는 기능을 수행한다.

transform (시작 반복자, 끝 반복자, 결과를 저장할 컨테이너의 시작 반복자, Pred)

위와 같은 구조를 가지고 있다.

transform(vec.begin(), vec.end(), vec.begin(), [](int i) { return i + 1; });

이 예시를 보면, begin 부터 end까지의 vec에서, 각 원소에 i + 1 을 한 결과를 반환한다는 의미이다.

원소탐색

  • find = 단순히 idx를 찾음
  auto result = std::find(vec.begin(), vec.end(), 3);
  • find_if = 조건에 맞는 경우 find 함
      std::find_if(current, vec.end(), [](int i) { return i % 3 == 2; });

find_if는 함수객체를 인자로 받아 참인 경우에 실행한다.

  • any_of, all_of = or 연산 , and 연산

출처

  // 파티원 모두가 15 레벨 이상이여야지 던전 입장 가능
  bool can_join_dungeon() {
    return std::all_of(users.begin(), users.end(),
                       [](User& user) { return user.level >= 15; });
  }

  // 파티원 중 한명 이라도 19렙 이상이면 특별 아이템 사용 가능
  bool can_use_special_item() {
    return std::any_of(users.begin(), users.end(),
                       [](User& user) { return user.level >= 19; });
  }

조건이 전체만족일경우 all_of,
부분만족일경우 any_of이다.

0개의 댓글