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() 를 빼면 해당 원소가 몇 개 들어있는지도 확인 가능