프로그래밍/나의 디버깅 노트
[ps][c++] test-case마다 vector을 초기화 하는 방법
miniOS
2021. 5. 2. 01:34
test-case가 주어지는 문제를 풀 때 가끔씩 전역변수로 선언된 vector을 케이스마다 새롭게 사용해야 하는 경우가 있다.
#include<bits/stdc++.h>
vector<int> a(20001);
...
int main(){
...
int t;
cin>>t;
while(t--){
...
for(int i=0; i<n; i++){
cin>>a[i];
}
...
}
...
}
위의 경우와 같이 전역변수 vector<int> a에 test-case마다 새로 값을 입력받아야 할 때에는,
test-case가 끝날 때 마다 전역변수 a의 값들을 초기화해주어야 한다.
이럴 때 자주 사용하는것은
a.clear()
이것일 것이다.
하지만
codingdog.tistory.com/entry/c-vector-clear-size를-0으로-만들어-준다
c++ vector clear 함수 : size를 0으로 만들어 준다.
안녕하세요. chogahui05입니다. ps를 하시다 보면, 테스트 케이스 문제를 많이 보셨을 겁니다. 보통, vector를 클리어 할 때, clear 메소드를 많이 이용하고요. 여기서 한 가지 질문. clear 메소드는 정말
codingdog.tistory.com
이 블로그의 글에 따르면 완벽하게 초기화 되지 않는다.
이것을 보완하여 완벽한 초기화를 하기 위해서
swap trick을 사용해주면 된다. 위의 예시를 활용해보자면
#include<bits/stdc++.h>
vector<int> a(20001);
...
int main(){
...
int t;
cin>>t;
while(t--){
...
for(int i=0; i<n; i++){
cin>>a[i];
}
...
vector<int>(20001).swap(a);
}
...
}
만약 이차원 vector라도 동일하게 사용해주면 된다.
#include<bits/stdc++.h>
vector< vector<int> > a(20001);
...
int main(){
...
int t;
cin>>t;
while(t--){
...
for(int i=0; i<n; i++){
cin>>a[i];
}
...
}
...
vector< vector<int> >(20001).swap(a);
}