중복 원소 제거를 위한 sort(), unique(), earse() 함수의 활용.

중복원소가 있는 것들을 제거해서 새로운 vector를 만들어서 거기에 중복이 없는 원소들이 들어가있도록 만드는 방법은, 

 임시 vector 한개, 그리고 중복이 제거된 원소를 담을 vector 한개를 통해서 구현해보았다. 

하지만 임시vector와 중복원소가 없는 원소들을 담을 unique vector 까지 두개를 선언해서 중복원소를 제거하는 방법 말고도

stl 내장함수인 unique 함수와 erase 함수를 통해서 원하는 중복 원소들을 제거한 vector를 얻어낼 수 있는 방법이 있고,

이 방법은 sort를 통해서 정렬이 되어있어야 하며, 그 정렬되어 있는 vector에  unique 함수를 사용해서 중복이 제거된 값들을 앞으로 쭉 몰아주고, 그리고 쓰레기 값들은 뒤로 쭉 나열해주면서 그때에 쓰레기값이 시작되는 위치의 iterator를 반환하는 함수를 통해서, 

이 값을 가지고 erase 함수를 통해서 그 시작 위치부터 end()까지 필요없는 값들을 지워주면, 

딱 중복 원소들을 제거한 내가 원하는 값들이 정렬되어 있는상태로 들어가있는 vector를 구할 수 있게 된다. 

 

  cin >> n;
  for(int i = 0; i < n; i++){
    cin >> x[i];
    tmp.push_back(x[i]);
  }
  sort(tmp.begin(), tmp.end());
  for(int i = 0; i < n; i++){
    if(i == 0 || tmp[i-1] != tmp[i])
      uni.push_back(tmp[i]);
  }

이렇게 작성해야 할 코드를, 

 

    for(int i=0; i<n; i++){
        cin>>x[i];
        uni.push_back(x[i]);
    }
    sort(uni.begin(),uni.end());
    uni.erase(unique(uni.begin(),uni.end()),uni.end());

이렇게 작성할 수 있는 것이다.

 물론 임시vector를 마련해서 중복원소를 제거한 새로운 unique vector의 원소들을 채워 나가는것도 좋은 방법이지만

sort, unique , erase를 활용한 아래와 같은 방법에 익숙해져서 이 방법을 잘 활용해보도록 하자. 

 

주의해야할 것은, 

unique 함수를 사용하기 위해서는 sort를 해야할것, 

그리고 쓰레기 값이 뒤에 담기는데 그 쓰레기 값의 시작 iterator를 반환한다는것,

그걸 erase 함수를 통해서 그 시작 iterator부터 end까지 지워서 내가 원하는 원소들만 중복없이 담긴 unique vector를 얻을것

 

명심하도록 하자. 

 

  Comments,     Trackbacks