250x250
Rainbow🌈Coder
My dev Note📒
Rainbow🌈Coder
전체 방문자
오늘
어제
  • 분류 전체보기 (411)
    • 공지사항 (0)
    • Debugger (10)
      • Visual Studio Debugger (1)
      • Chrome DevTools (3)
      • Visual Studio Code Debugger (4)
      • eclipse (1)
      • intelliJ (1)
    • OOP (2)
      • OOP (2)
    • TypeScript (54)
      • 타입스크립트 TypeScript (54)
    • Javascript (87)
      • Javascript (45)
      • Node.js (19)
      • React (5)
      • FE 개발환경설정 (3)
      • React와 Node 같이 때려잡기 (6)
      • next.js (2)
      • pixi.js (7)
    • 마크업 (23)
      • Html & Css (23)
    • C# (80)
      • C# (12)
      • 이것이 C#이다 (68)
    • C++ (30)
      • c++ (27)
      • win api (3)
    • Unity (18)
      • Unity(기초) (8)
      • Unity(C#중급) (5)
      • 유니티 포톤(네트워크) (4)
      • unity c# MyCode (1)
    • Java & Spring (29)
      • Java (11)
      • 스프링 (8)
      • Java Algorithm (9)
      • Javs Data Structures (1)
    • 자료구조와 알고리즘 (15)
      • 자료구조 (5)
      • 알고리즘 (10)
    • 형상관리 (15)
      • Git (11)
      • 소스트리 (3)
    • 그래픽스 (7)
      • WebGl (7)
    • AWS (3)
      • aws (3)
    • 리눅스 (5)
      • 리눅스 (5)
    • 책 리뷰 (13)
      • 클린코드(책리뷰) (3)
      • 유지보수가능한코딩의기술C#편(책리뷰) (1)
      • 리팩토링(자바스크립트판) (9)
    • Server (2)
      • 게임 서버(네트워크, 멀티쓰레드,OS) (2)
    • 설계, 아키텍쳐 (4)
    • 파이썬 (5)
    • 디자인패턴 (2)
    • mocha (2)
    • Jest (1)
    • Spine (1)
    • 인공지능 (1)
      • 혼자공부하는머신러닝+딥러닝 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • MySQL
  • ㅣㄷ
  • 컴포지션
  • 위임

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Rainbow🌈Coder

My dev Note📒

C++/c++

[STL] unique로 vector에서 중복 원소 제거하기 : 선 sort 후 unique!

2022. 1. 16. 22:40
728x90

우선 <algorithm>헤더가 필요하다.

sort와 unique를 함께 써주어야

의도 한 바대로 unique로 vector에서 중복되는 원소를 제거할 수 있다.

 

 

두 가지 로직이 가능하다.

 

첫번째

    sort(result.begin(),result.end());
    result.resize(unique(result.begin(),result.end())-result.begin());

 

두번째

    sort(result.begin(),result.end());
    result.erase(unique(result.begin(), result.end()),result.end());

 

 

두 구문을 보면

 

unique는 중복되는 원소들이 제외된 상태의 vector의 마지막 원소 다음 iterator값을 리턴한다는 것을 눈치챌 수 있다.

 

즉, unique는 중복 제거를 하고, 마지막 원소의 iterator값을 리턴한다.

 

Unique를 쓰기 전에 sort를 해주어야만 하는 원리(강조)는 다음과 같다.

 

unique는 포인터들로 작동한다. first와 result

 

template<class ForwardIt>
ForwardIt unique(ForwardIt first, ForwardIt last)
{
    if (first == last)
        return last;
 
    ForwardIt result = first;
    while (++first != last) {
        if (!(*result == *first) && ++result != first) {
            *result = std::move(*first);
        }
    }
    return ++result;
}

std::move는 해당 블로그 참고

씹어먹는 C++ 토막글 ① - Rvalue(우측값) 레퍼런스에 관해 (modoocode.com)

first는 벡터의 맨 첫 번째 원소를 가리키는 포인터로,

비교가 진행될수록 한칸 씩 이동하며 last에 다다르면 첫번째 조건문에 걸려서 return한다. 


unique는 result가 가리키고 있는 값과 first가 가리키고 있는 값이 다르다면

result를 한 칸 옮기고 거기에 first가 가리키는 포인터를 std::move시킨다.

 

즉 result은 원 포인터로서 작동하므로

 

122345 일 경우

첫번째 2를 result가 가르킬 때 *result = std::move(*first);를 무시하고 while이 진행되고

그 다음 두번째 2에서 3에 먼저 도착한 fisrt포인터를 std::move받는다.

 

그러나,

212345의 경우에는

2가 중복됨에도 불구하고 계속 *result = std::move(*first);코드가 동작되어

이전에 2을 가리키고 다음에 1를 가리킨 다음 다시 2을 가리킨다한들 2가 중복 원소인지 알지 못하는 것이다.

 

그래서 Unique를 쓰기 전에 

sort를 해주어 값은 값을 가지는 벡터가 원소가 순서대로 이어지게끔 상태를 만들어놓아야 하는 것이다. 

작성한 소스코드 1

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> numbers) {
    vector<int> result;
    for(int i=0; i<numbers.size(); i++)
    {
        for(int j=0; j<numbers.size(); j++)
        {
            if(i==j)continue;
            int t = numbers[i];
            t +=numbers[j];
            result.push_back(t);
        }
    }
    sort(result.begin(),result.end());
    result.resize(unique(result.begin(),result.end())-result.begin());
    return result;
}

작성한 소스코드 2 

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> numbers) {
    vector<int> result;
    for(int i=0; i<numbers.size(); i++)
    {
        for(int j=0; j<numbers.size(); j++)
        {
            if(i==j)continue;
            int t = numbers[i];
            t +=numbers[j];
            result.push_back(t);
        }
    }
    sort(result.begin(),result.end());
    result.erase(unique(result.begin(), result.end()),result.end());
    return result;
}

 

참고 블로그:

std::unique - cppreference.com

c++ unique 함수 : 정렬을 먼저 해야 중복이 제거된다. (tistory.com)

728x90

'C++ > c++' 카테고리의 다른 글

[STL] 우선순위 큐 priority_queue  (0) 2022.01.18
[STL] set  (0) 2022.01.18
[STL] map에서 Value를 기준으로 정렬하고 싶을 경우  (0) 2022.01.15
[STL] map  (0) 2022.01.15
[STL] Vector내 최대값, 최소값과 그 인덱스 알아내기  (0) 2022.01.11
    'C++/c++' 카테고리의 다른 글
    • [STL] 우선순위 큐 priority_queue
    • [STL] set
    • [STL] map에서 Value를 기준으로 정렬하고 싶을 경우
    • [STL] map
    Rainbow🌈Coder
    Rainbow🌈Coder
    몰라도 결국은 아는 개발자, 그런 사람이 되기 위한 매일의 한걸음

    티스토리툴바