Search

함수

fill()과 memset()

fill()과 memset()은 배열을 초기화 할 때 쓰인다.
fill은 모든 값으로 초기화 할 수 있다.
memset()을 쓰다 보면 0, -1 이외의 값으로 초기화하다 틀리는 경우가 있어 fill()이 더 추천되지만 memset이 0, -1로 초기화 시킬 때 더 빠르다.

fill()

O(n)
fill(시작값, 끝값, 초기화하는 값) 로 값을 초기화한다.
[first, last)까지 val로 초기화. [은 포함, )은 포함하지 않는다를 의미
#include <iostream> #include <string> #include <array> #include <algorithm> #include <vector> using namespace std; int a[10]; int b[10][10]; int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //fill(&a[0], &a[10], 100); fill(a, a + 10, 100); for (int i = 0; i < 10; i++) { cout << a[i] << " "; } cout << '\n'; //fill(&b[0][0], &b[9][10], 2); fill(&b[0][0], &b[0][0] + 10 * 10 , 2); for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { cout << b[i][j] << ' '; } cout << '\n'; }
C++
복사
1차원일 경우 fill(a, a+10, 100) 과 같이 해도 되지만 2차원 이상일 경우는 fill(&b[0][0], &b[0][0] + 10 * 10, 2) 과 같이 써야 한다.

memset()

0, -1, char형의 하나의 문자로 초기화 할 때 사용.
memset(배열의 이름, k, 배열의 크기)
#include <iostream> #include <string> #include <array> #include <algorithm> #include <vector> using namespace std; int a[10]; int b[10][10]; int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); memset(a, -1, sizeof(a)); memset(b, 0, sizeof(b)); for (int i = 0; i < 10; i++) { cout << a[i] << ' '; } cout << '\n'; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { cout << b[i][j]<< ' '; } cout << '\n'; } }
C++
복사

memcpy()

어떤 변수의 메모리에 있는 값들을 다른 변수의 “특정 메모리값” 으로 복사할 때 사용한다. 주로 배열을 깊은 복사할 때 사용.
memcpy(tmp, a, sizeof(a))

sort()

sort(first, last, 커스텀비교함수)
greater<int>()
bool cmp ~
vector<pair<int, int>> v;

unique()

범위 안의 있는 요소 중 앞에서부터 서로를 비교해가며 중복되는 요소를 제거하고 나머지 요소들은 삭제하지 않고 그대로 둔다.
중복되지 않은 요소로 채운 후, 그 다음 이터레이터를 반환함.
내가 이해하기로는… 그니까 이터레이터가 가르키는 곳은 한 벡터의 서로 다른 요소 개수임.
예를 들어 5를 가르킨다.. 하면 서로 다른 요소 개수가 5개라는 것을 의미한다.
확인하려면 auto it = unique(v.begin(), v.end()) 하고
cout << it - v.begin() 하면 값이 나옴.
sort(), erase(unique() 로 코드를 구축하는 것이 좋음 . 꼭 세트로 쓰자
int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); vector<int> s = { 4, 3, 3, 5, 1, 2, 3 }; sort(s.begin(), s.end()); s.erase(unique(s.begin(), s.end()), s.end()); for (int i : s) cout << i << ' '; }
C++
복사
와 같이.

lower_bound() 와 upper_bound()

정렬된 배열에서 어떤 값이 나오는 첫 번째 지점 또는 초과하는 지점 찾기.
#include <iostream> #include <string> #include <array> #include <algorithm> #include <vector> using namespace std; bool re(int a, int b) { return a > b; } int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); vector<int> s = { 1, 2, 3, 3, 3, 4}; cout << lower_bound(s.begin(), s.end(), 3) - s.begin() << '\n'; //2 cout << upper_bound(s.begin(), s.end(), 3) - s.begin() << '\n'; //5 }
C++
복사
upper_bound() 에서 lower_bound() 를 빼면 해당 원소가 몇 개 들어있는지도 확인 가능