보통 데이터의 집합은 배열로 저장하는 것이 일반적이지만, vector, queue 등의 데이터 타입이 가지는
차별점으로 인해 다양한 데이터 타입을 사용하는 경우가 많은데, 자주 쓰는 배열과 달리 익숙하지 않아
초기화하는 것에 애를 먹은 경험이 있어 이러한 다양한 데이터 타입을 초기화 하는 방법을 간단하게 정리해보려한다.
1. vector 초기화
내가 보통 사용하는 방법은
vector<int> vec;
int main(){
//vec에 값을 넣어준다
vector<int> tmp;
vec=tmp;
}
위와 같이 완전히 동일한 새로운 벡터를 만들어준 뒤, = 연산자로 초기화해주는 것이다.
보통 초기화 방법을 검색하면 fill 함수( 주어진 벡터내 모든 데이터를 지정값으로 초기화) 를 쓴다는데 이 방식대로면 단순히 '값' 을 초기화하는 것으로 아무것도 들지 않은 선언 직후의 벡터로 초기화 되는 것이 아니라 size는 유지한채
값만 초기화 되서 사실상 완전한 초기화가 되지 않는다.
아래는 벡터 배열 초기화 이다.
vector<int> vec[100];
int main(){
vector<int> tmp[100];
//vec에 값을 넣어준다
for(int i=0;i<100;i++){ //이차원 동적할당에서 유사하게 사용해봤을 것이다
vec[i]=tmp[i];
}
}
이 경우, vec=tmp 로 초기화하는 것은 에러가 난다. 왜 그럴까?
배열을 사용해 봤으면 알겠지만, 배열의 이름은 첫 값의 위치값 (배열 명이 arr 일 경우 arr[0]의 위치값) 을 리턴해준다. 벡터 '배열' 에서 vec=tmp 는'vec[0] 의 위치값 = tmp[0] 의 위치값' 이라고 컴퓨터가 인식한다. 하지만 배열의 위치값은 수정할 수 없는 값이다. 다만, int *arr; int* arr2 과 같이 포인터를 사용해 공간 할당을 한다면 arr=arr2 와 같이 위치값을 변화시킬 수 있으니 참고하자.
2. queue 초기화 ( stack 도 비슷하게 된다)
이경우는 간단히 보고 넘어가겠다.
queue qu;
while(!qu.empty())
qu.pop();
위의 코드가 끝이다. 다른 방법도 많지만, 전부 써본 결과 외울 필요도 없고, 에러도 덜나고, 직관적인 위 코드가 가장 편했다. 작동 방식은 그냥 queue가 텅 빌 때 까지 pop을 반복하는 것이다.
'코딩테스트' 카테고리의 다른 글
knapsack 알고리즘 (백준 1535 , 4781 , 7579 ) (0) | 2022.03.05 |
---|---|
백준 1005번을 통한 최장거리 알고리즘과 위상정렬 소개 (0) | 2022.02.14 |
경로 추적에 대하여 (다익스트라, 플로이드 ) (1) | 2021.12.24 |
x,y좌표와 배열의 차이점 (0) | 2021.12.22 |
[백준 17472] 다리만들기 2 와 mst에 대한 설명 (0) | 2021.12.19 |