컨테이너에 기본값 채우기
1. 배열
1.1. 1차원 배열
1.1.1. 기존 코드
1.1.2. 1. fill_n 함수 이용
1.1.3. 2. memset 함수 이용
1.2. 다차원 배열
1.2.1. 기존 코드
1.2.2. 1. fill 함수 이용
1.2.2.1. 실험
1.2.3. 2. memset 함수 이용
2. vector 초기화
2.1. 1차원 vetor
2.1.1. 기존 코드
2.1.2. 1. 기본 초기화 1
2.1.3. 2. 기본 초기화 2
2.1.4. 3. fill 함수 이용
2.1.5. 4. assign 함수 이용
2.1.6. 5. 배열로 초기화
2.1.7. 6. vector로 초기화
2.2. 다차원 vector
2.2.1. 기존 코드
2.2.2. 1. 기본 초기화
2.2.3. 2. fill 함수

컨테이너에 기본값 채우기
1. 배열
1.1. 1차원 배열
1.1.1. 기존 코드
#include <iostream>
using namespace std;
int main() {
int arr[3];
for (int i = 0; i < 3; i++) {
cout << arr[i] << " ";
}
}
c++
<결과>
-858993460 -858993460 -858993460
html
초기화하지 않았으므로 쓰레기값이 나온다.
1.1.2. 1. fill_n 함수 이용
int main() {
int arr[3];
fill_n(arr, 3, -1);
for (int i = 0; i < 3; i++) {
cout << arr[i] << " ";
}
}
c++
<결과>
-1 -1 -1
html
1.1.3. 2. memset 함수 이용
int arr[3];
memset(arr, -1, sizeof(arr));
for (int i = 0; i < 3; i++) {
cout << arr[i] << " ";
}
}
c++
<결과>
-1 -1 -1
html
1.2. 다차원 배열
1.2.1. 기존 코드
#include <iostream>
using namespace std;
int main() {
int arr[3][3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << arr[i][j] << " ";
}
cout << endl;
}
}
c++
<결과>
-858993460 -858993460 -858993460
-858993460 -858993460 -858993460
-858993460 -858993460 -858993460
html
초기화되지 않아 쓰레기값이 나온다.
1.2.2. 1. fill 함수 이용
int main() {
int arr[3][3];
fill(&arr[0][0], &arr[2][3], -1);
// 채우고자하는 행 수는 -1, 열 수는 그대로
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << arr[i][j] << " ";
}
cout << endl;
}
}
c++
<결과>
-1 -1 -1
-1 -1 -1
-1 -1 -1
c++
1.2.2.1. 실험
시도 | 코드 | 결과 |
---|---|---|
1 | fill(&arr[0][0], &arr[2][2], -1); |
-1 -1 -1 -1 -1 -1 -1 -1 -858993460 |
2 | fill(&arr[0][0], &arr[2][1], -1); |
-1 -1 -1 -1 -1 -1 -1 -858993460 -858993460 |
3 | fill(&arr[0][0], &arr[1][3], -1); |
-1 -1 -1 -1 -1 -1 -858993460 -858993460 -858993460 |
시도 1, 2를 통해
열은 마지막 행에 반영되는 것을 알 수 있다.
2를 입력했으면 마지막 행의 index 0~1까지만
1을 입력했으면 마지막 행의 index 0~0까지만
시도 3을 통해
행은 그대로 두번째인자에 입력한 그대로 반영되는 것을 알 수 있다.
1을 입력했으면 index 0 ~ 1까지, 2를 입력했으면 index 0 ~ 2까지
1.2.3. 2. memset 함수 이용
int main() {
int arr[3][3];
memset(arr, -1, sizeof(arr));
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << arr[i][j] << " ";
}
cout << endl;
}
}
c++
<결과>
-1 -1 -1
-1 -1 -1
-1 -1 -1
html
2. vector 초기화
STL 의 컨테이너 중 하나인 vector를 초기화 해보자.
2.1. 1차원 vetor
2.1.1. 기존 코드
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec;
vector<int>::iterator iter;
for (iter = vec.begin(); iter != vec.end(); iter++)
cout << *iter << " ";
}
c++
<결과>
아무 값도 아직 넣지 않았으므로 결과값으로 아무것도 나오지 않는다.
2.1.2. 1. 기본 초기화 1
//vector<int> vec;
vector<int> vec = { -1,-1,-1 };
c++
배열과 같이 원소를 직접 할당해줄 수 있다.
2.1.3. 2. 기본 초기화 2
//vector<int> vec = { -1,-1,-1 };
vector<int> vec(3);
c++
다음과 같이 코드를 바꿔보자.
<결과>
0 0 0
html
크기 3짜리 int형 vector가 만들어지며 0으로 자동 초기화 된다.
//vector<int> vec(3);
vector<int> vec(3,-1);
c++
또 코드를 바꿔보자.
<결과>
-1 -1 -1
html
크기 3짜리 int형 vector가 만들어지며 -1로 자동 초기화 된다.
2.1.4. 3. fill 함수 이용
vector<int> vec(3);
fill(vec.begin(),vec.end(),-1);
c++
<결과>
-1 -1 -1
html
2.1.5. 4. assign 함수 이용
vector<int> vec;
vec.assign(3,-1);
for (int i = 0; i < 3; i++) {
cout << vec[i] << " ";
}
c++
<결과>
-1 -1 -1
html
2.1.6. 5. 배열로 초기화
int main() {
int arr[3];
memset(arr, -1, sizeof(arr));
vector<int> vec(arr, arr + sizeof(arr)/sizeof(int));
vector<int>::iterator iter;
for (iter = vec.begin(); iter != vec.end(); iter++)
cout << *iter << " ";
}
c++
위에서 배열을 초기화하는 방법으로 초기화한 후, vector를 생성하면서 배열로 초기화해줄 수 있다.
여기서 주의할 점은 sizeof 함수의 사용이다.
memset 함수는 메모리를 byte 단위로 생각하여 arr의 size를 그대로 넘겨주면 된다. 따라서 3개의 int가 있는 arr 배열의 크기는 3*4byte = 12byte가 되어 해당 메모리에 -1값이 할당될 것이다.
반면 vector의 생성자에 넘겨주는 매개변수는 시작 주소와 마지막 주소이다. 마지막 주소를 (시작 주소에 배열의 요소 개수를 더한 값)으로 생각한다면 요소의 갯수는 메모리 단위가 아니여서 계산을 통해 구해주어야한다. 12byte로 반환되는 sizeof(arr)의 값을 하나의 요소가 차지하는 메모리 sizeof(int) 즉, 4byte로 나누어주면 요소의 갯수를 얻을 수 있다.
2.1.7. 6. vector로 초기화
이미 만들어져 있는 vector의 값으로 초기화할 때는 생성자에 해당 vector의 이름만 넘겨주면 된다.
int main() {
int arr[3];
memset(arr, -1, sizeof(arr));
vector<int> vec1(arr, arr + sizeof(arr)/sizeof(int)); // 이름 변경
vector<int> vec(vec1); // 추가
vector<int>::iterator iter;
for (iter = vec.begin(); iter != vec.end(); iter++)
cout << *iter << " ";
}
c++
<결과>
-1 -1 -1
html
2.2. 다차원 vector
2.2.1. 기존 코드
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<vector<int>> vec(3, vector<int>(3));
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << vec[i][j] << " ";
}
cout << endl;
}
}
c++
<결과>
0 0 0
0 0 0
0 0 0
html
2.2.2. 1. 기본 초기화
//vector<vector<int>> vec(3, vector<int>(3));
vector<vector<int>> vec(3, vector<int>(3,-1));
c++
<결과>
-1 -1 -1
-1 -1 -1
-1 -1 -1
html
2.2.3. 2. fill 함수
int main() {
vector<vector<int>> vec(3, vector<int>(3));
vector<vector<int>>::iterator iter;
for (iter = vec.begin(); iter!= vec.end(); iter++){
fill(iter->begin(), iter->end(), -1);
}
}
c++
<결과>
-1 -1 -1
-1 -1 -1
-1 -1 -1
html
<바둑이님의 댓글로 2021-03-27 수정되었습니다>
vector<vector<int>> vec(3, vector<int>(3));
fill(vec.begin(), vec.end(), vector<int>(3, -1));
<결과>
-1 -1 -1
-1 -1 -1
-1 -1 -1
html
fill 함수는 채울 수 있는 자료형 (매개변수 3번째)이 그냥 const Type 형으로 자료형이 상관없기 때문에 vector자체를 넣어주면 제대로 초기화 된다.
'컴퓨터과학 (CS) > Algorithm' 카테고리의 다른 글
[c++] 알고리즘 개념공부 :: 자료구조 - 배열, 문자열 (0) | 2020.07.19 |
---|---|
[c++] CAS 구현 및 ABA 문제 해결 :: mutex(spin lock)와의 비교 (1) | 2020.07.02 |
[알고리즘] 과제 5. 2의 홀수제곱수 - 1은 소수일까? (0) | 2020.03.28 |
[알고리즘] 과제 4. 1000만개 데이터 퀵 정렬 시 걸리는 시간 (0) | 2020.03.28 |
[알고리즘] 과제 3. Tony Hoare :: QuickSort 논문 해석하기 (0) | 2020.03.26 |
Comment