[C++] 유용한 라이브러리 및 함수 정리

정다은·2022년 1월 30일
0

📌 참고

알고리즘 문제 풀면서 자주 활용하는 또는 헷갈리는 라이브러리 및 함수들을 지속적으로 업데이트할 예정입니다!

#include <algorithm>

> find

template <class InpuptIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& val);
  • first부터 last전까지의 원소 중 val과 일치하는 첫 번째 원소를 가리키는 반복자 반환
  • 일치하는 원소를 찾지 못할 경우 last 반환
    🚨 string 라이브러리의 find 함수와 다름
// example
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;


int main() {  
  vector<int> v = { 1,2,3,4,5 };
  auto iter = find(v.begin(), v.end(), 6);
  if (iter != v.end()) {
      cout << *iter << endl;
  }
  else {
      cout << "not found" << endl;
  }
  
  return 0;
}

> next_permutation & prev_permutation

bool next_permutation (BidirectionalIterator first, BidirectionalIterator last);
bool next_permutation (BidirectionalIterator first, BidirectionalIterator last, Compare comp);
  • 인자로 vector의 iterator 또는 배열의 주소를 넣어줄 수 있음
  • first는 구하고자 하는 순열의 시작, last는 구하고자 하는 순열의 끝
  • 다음 순열의 결과가 해당 vector 또는 배열에 적용되고 true 반환
  • 다음 순열이 없다면 false 반환
    • next_permutation: 데이터의 정렬이 오름차순 전제이므로 다음 순열이 이전 순열보다 작다면
    • prev_permutation: 데이터의 정렬이 내림차순 전제이므로 다음 순열이 이전 순열보다 크다면
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {  
    vector<int> v;
    for (int i=1; i<=3; i++) {
        v.push_back(i);
    }

    // 오름차순으로 정렬된 vector에 대해 next_permutation 적용
    do {
        for (int i=0; i<v.size(); i++) {
            printf("%d ", v[i]);
        }
        printf("\n");
    } while(next_permutation(v.begin(), v.end()));
    /* 출력 결과
    1 2 3 
    1 3 2 
    2 1 3 
    2 3 1 
    3 1 2 
    3 2 1
    */

    // 내림차순으로 정렬된 vector에 대해 prev_permutation 적용
    sort(v.begin(), v.end(), greater<int>());
    do {
        for (int i=0; i<v.size(); i++) {
            printf("%d ", v[i]);
        }
        printf("\n");
    } while(prev_permutation(v.begin(), v.end()));
    /* 출력 결과
    3 2 1
    3 1 2
    2 3 1
    2 1 3
    1 3 2
    1 2 3
    */

    return 0;
}

> max_element & min_element

template <class ForwardIterator>
ForwardIterator max_element (ForwardIterator first, ForwardIterator last);
template <class ForwardIterator, class Compare>
ForwardIterator max_element (ForwardIterator first, ForwardIterator last, Compare comp);
  • 범위 [first, last) 중에서
    • max_element()는 가장 큰 값의 iterator 반환
    • min_element()는 가장 작은 값의 iterator 반환
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {  
    vector<int> v; // 1 2 3 4 5 6 7 8 9 10
    for (int i=0; i<10; i++) {
        v.push_back(i+1);
    }

    // 반환되는 iterator를 활용하여 최댓값, 최솟값의 인덱스 구하기
    int maxIndex = max_element(v.begin(), v.end()) - v.begin();
    int minIndex = min_element(v.begin(), v.end()) - v.begin();
    
    // 반환되는 iterator에 *연산자를 활용하여 최댓값, 최솟값 구하기
    int maxValue = *max_element(v.begin(), v.end());
    int minValue = *min_element(v.begin(), v.end());

    cout << "MAX index " << maxIndex << " value " << maxValue << endl;
    cout << "MIN index " << minIndex << " value " << minValue << endl;
    
    /* 출력 결과
    MAX index 9 value 10
    MIN index 0 value 1
    */

    return 0;
}

> lower_bound & upper_bound

template <class ForwardIterator, class T>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val);
  • 범위 [first, last) 중에서
    • lower_bound는 val 값보다 같은 값 (이 없을 경우 val 보다 큰 값 중에서 가장 작은 값)이
      처음으로 등장하는 위치의 iterator 반환
    • upper_bound는 val 값을 초과하는 값이 처음으로 등장하는 위치의 iterator 반환
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector<int> v= { 1, 2, 2, 2, 3, 5, 7 };

    int firstIdx = lower_bound(v.begin(), v.end(), 2) - v.begin();
    int lastIdx = upper_bound(v.begin(), v.end(), 2) - v.begin();

    cout << "2 appears between idx [" << firstIdx << "," << lastIdx << ")" << endl;
    // 출력 결과: 2 appears between idx [1,4)

    return 0;
}

#include <string>

> find

size_t find(const string& str, size_T pos=0) const;
  • str은 찾고자 하는 문자열, pos는 찾기 시작할 위치
  • str을 찾았을 경우 해당 문자열이 시작하는 인덱스 반환
  • 찾지 못했을 경우 string::npos 리턴
    🚨 algorithm 라이브러리의 find 함수와 다름
// example
#include <iostream>
#include <string>
using namespace std;

int main() {  
    string word = "Hello World!";
    if (word.find("World") != string::npos) {
        cout << "Found, Index: " << word.find("World") << endl;
    }
    else {
        cout << "Not Found" << endl;
    }

    return 0;
}

> substr

basic_string substr(size_type pos = 0, size_type count = npos) const;
  • pos 위치부터 count 길이(문자 개수) 만큼의 문자열 일부를 반환
  • 즉, [pos, pos+count)
    🚨 [pos, count) 아님 주의!
// example
#include <iostream>
#include <string>
using namespace std;

int main() {
    string str = "Hello World!";
    cout << str.substr(0, 5) << endl; // Hello
    cout << str.substr(6, 5) << endl; // World
    cout << str.substr(6) << endl; // World!
    return 0;
}

> getline

getline(istream& is, string str);
getline(istream& is, string str, char delim);
  • is는 입력스트림 오브젝트, str은 입력받은 문자열을 저장할 string 변수, delim은 구분자(별도로 지정하지 않을 경우 디폴트 값은 "\n"
  • 🚨 주의! cin은 공백 및 줄바꿈을 무시하는 반면, getline은 공백 및 줄바꿈까지 포함함!
    아래와 같이 cin과 getline을 연달아 함께 쓸 경우 cin.ignore() 써서 입력 버퍼를 비워줘야한다. cin.ignore()을 쓰지 않을 경우, 다음 줄의 getline은 이전 줄의 cin이 입력버퍼에 남겨둔 공백이나 줄바꿈을 읽어들이게 된다.
// 참고
int n;
string s;
cin >> n;
cin.ignore();
getline(cin, s);
profile
벨로그에는 주로 알고리즘 문제를 풀고 기록합니다 ✍

0개의 댓글