📌 참고
알고리즘 문제 풀면서 자주 활용하는 또는 헷갈리는 라이브러리 및 함수들을 지속적으로 업데이트할 예정입니다!
#include <algorithm>
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;
}
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;
}
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;
}
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>
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;
}
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(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);