c++ 메소드 정리

Kim Ju Hui·2020년 3월 20일
1

알고리즘

목록 보기
1/9
post-thumbnail

백준과 같은 알고리즘 문제들을 풀면서 검색했던 메소드 사용법들을 한눈에 보기 쉽도록 정리한 페이지이다. (나는 빡대가리니까^_^)

정석적인 설명은 cplusplus.com을 참고하도록 하자. 이 페이지는 ACM-ICPC에서도 유일하게 접속 가능한 웹 페이지이다.

memset (전체 원소를 특정 값으로 초기화)

#include <cstring>

 void memset(void *ptr, int value, size_t num);
  • ptr : 채우고자 하는 메모리의 시작 포인터(시작 주소)
  • value : 메모리에 채우고자 하는 값. int형이지만 내부에서는 unsigned char(1byte)형태로 변환되어 저장됨
  • num : 채우고자 하는 바이트의 수. 즉, 채우고자 하는 메모리의 크기
// arr 배열의 원소를 0으로 초기화하고 싶을 때

#include <cstring>

int main()
{
    int arr[10];
    memset(arr, 0, sizeof(arr));
}

위의 메소드를 사용할때 어려움을 겪었던 문제

숫자의 개수 2019-10-30


unique (벡터 중복 원소 제거)

#include <algorithm>

vector<type>::iterator unique(v.begin(), v.end());
  • vector 배열에서 중복되지 않는 원소들을 배열 앞에서부터 채워나가는 함수
  • 어떤 원소가 중복되었는지는 앞,뒤의 원소와 비교하여 판단하기 때문에 반드시 정렬을 한 후 실행해야 함
  • unique 함수는 자신이 바꾼 vector의 end()값을 반환함(쓰레기값의 시작 iterator)
  • unique를 실행하고 나서 완벽한 중복 제거를 하고 싶다면 erase()함수도 같이 사용해야 함
#include <vector>
#include <algorithm>

vector<int> input;
// input = [1, 1, 2, 2, 2, 3, 4, 5, 5]

// #1. unique 함수만 실행한 경우
    unique(input.begin(), input.end());
    // input = [1, 2, 3, 4, 5, 1, 2, 2, 5]
    // 쓰레기값의 순서는 바뀔 수 있음

// #2. erase와 unique를 둘 다 실행한 경우
    erase(unique(input.begin(), input.end()), input.end());
    // input = [1, 2, 3, 4, 5]

위의 메소드를 사용할때 어려움을 겪었던 문제

단어 정렬 2019-11-03


compair (custom sort 사용 시 비교 함수)

맨날 custom sort가 필요할 때 마다 compare 함수 구현 방법 헷갈려서 구글링한지 어언 3년..(2019-11-03기준)

구글링하기 귀찮아서 내가 사용한 예시들을 좀 정리해 보려고 한다.

  1. first 기준 오름차순, first가 같을 경우 second 오름차순 정렬

     bool compair(pair<int,int> a, pair<int,int> b)
     {
         if(a.first==b.first)
             return a.second < b.second;
         else
             return a.first < b.first;
     }

    위의 메소드를 사용할때 어려움을 겪었던 문제

    좌표 정렬하기 2019-11-03

  2. second 기준 오름차순, second가 같을 경우 first 오름차순 정렬

    bool compair(pair<int,int> a, pair<int,int> b)
    {
        if(a.second == b.second)
            return a.first < b.first;
        else
            return a.second < b.second;
    }

    위의 메소드를 사용할때 어려움을 겪었던 문제

    좌표 정렬하기 2 2019-11-03

  3. 단어의 길이 기준 오름차순, 단어의 길이가 같을 경우 사전 순 정렬

    int compare(string a, string b)
    {
        if(a.length() == b.length())
            return a < b;
        else
            return a.length() < b.length();
    }

    위의 메소드를 사용할때 어려움을 겪었던 문제

    단어 정렬 2019-11-03


static_cast<type> (형 변환)

C에서는 출력을 하기 위해서는 출력 형식을 지정해 주기 때문에 해당 형식으로 알아서 출력이 되었는데, C++은 cout을 사용하기 때문에 그냥 출력하면 형 변환이 되지 않는다.

따라서, static_cast<type>을 이용하여 형 변환을 해 주어야 한다.

char input = 'A';
int index = input - 'A';

cout << index << "\n"
     << static_cast<char> (index + 'A') << "\n"
     
// 출력 결과
// 0
// A

위의 메소드를 사용할 때 어려움을 겪은 문제
1991번 : 트리 순회 2020-04-07

reverse(begin(), end()) (뒤집기)

string이나 vector 등의 iterator가 있는 자료형을 뒤집을 때 사용한다.

#include <algorithm>

string sample = "ABCD";

reverse(sample.begin(), sample.end());

printf("%s", sample.c_str());

// 출력 결과
// DCBA
profile
뻘짓을 많이 하는 꼬부기

0개의 댓글