ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [c++] unique 함수
    Programming/c++ 2022. 8. 1. 22:47
    728x90

    unique 함수 

    : 지정된 범위에서 서로 옆에 있는 중복 요소를 제거합니다.

     

    1.함수 헤더 파일

    #include <algorithm>

     

    2.함수 원형

    template<class ForwardIterator>
    ForwardIterator unique(
        ForwardIterator first,
        ForwardIterator last);
    
    template<class ForwardIterator, class BinaryPredicate>
    ForwardIterator unique(
        ForwardIterator first,
        ForwardIterator last,
        BinaryPredicate pred);
    
    template<class ExecutionPolicy, class ForwardIterator>
    ForwardIterator unique(
        ExecutionPolicy&& exec,
        ForwardIterator first,
        ForwardIterator last);
    
    template<class ExecutionPolicy, class ForwardIterator, class BinaryPredicate>
    ForwardIterator unique(
        ExecutionPolicy&& exec,
        ForwardIterator first,
        ForwardIterator last,
        BinaryPredicate pred);

     

    3.매개 변수(Parameter)

    - exec : 사용할 실행 정책

    - first : 중복 제거를 위해 검색할 범위에서 첫 번째 요소 위치의 주소를 지정하는 forward iterator

    - last : 중복 제거를 위해 검색할 범위에서 마지막 요소 다음 위치의 주소를 지정하는 forward iterator

    - pred : 두 요소가 같은 것으로 간주되려면 충족해야 하는 조건을 정의하는 사용자 정의 조건자 함수 개체 (return true, false)

     

     

    4.return 값(반환 값)

    연속 중복 항목을 포함하지 않는 수정된 시퀀스의 새로운 끝에 대한 forward iterator,

    마지막 요소 다음 위치의 주소

     

    4.예제

    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <vector>
    
    int main(){
    
    	// 1
    	vector<int> test = { 1,1,3,3,0,1,1 };
    
    	vector<int>::iterator iter = unique(test.begin(), test.end()); // 1 3 0 1 x x x
    	
    	test.resize(distance(test.begin(), iter)); // 1 3 0 1
    
    	for (iter = test.begin(); iter != test.end(); ++iter) {
    		cout << ' ' << *iter;
    	}
    	cout << '\n';
        
        //2 
        vector<int> test3 = { 1,1,3,3,0,1,1 };
    	auto iter2 = unique(test3.begin(), test3.end());
    	test3.erase(iter2, test3.end());
        
    	return 0;
    }

     

    예제 설명

     

    vector<int>::iterator iter = unique(test.begin(), test.end()); // 1 3 0 1 x x x

    연속으로 중복된 요소가 발견되면 벡터의 맨 뒤로 보내버림(가비지 값으로)
    가비지 값으로 가지고 있으니 test 벡터의 크기는 동일하다. 삭제X

     

    test.resize(distance(test.begin(), iter)); // 1 3 0 1

    distance는 두 반복자의 거리를 반환해준다.

    iter 반복자는 unique함수의 결과 값이 저장되어 있다.( 수정된 시퀀스의 마지막 요소의 다음 주소)

    resize로 test 벡터의 크기를 다시 지정한다.

     

    	vector<int> test3 = { 1,1,3,3,0,1,1 };
    	auto iter2 = unique(test3.begin(), test3.end());
    	test3.erase(iter2, test3.end());	// 1 3 0 1

    iter2(수정된 시퀀스의 마지막 요소 다음 위치)부터  test2 벡터의 마지막 요소는

    중복된 요소로 맨 뒤로 보내진 가비지 값이다.

    erase함수를 사용하여 가비지 값들을 삭제한다.

     

    위 코드를 아래와 같이 사용할 수 있다.

    	vector<int> test3 = { 1,1,3,3,0,1,1 };
    	test3.erase(unique(test3.begin(), test3.end()), test3.end());

     

     

    참고 문서

     

     

    <algorithm> 함수

    함수에 대해 자세히 알아보기

    docs.microsoft.com

     

     

     

     

     

     

    [c++] std::accumulate 함수 vector sum

    accumulate 함수 STL container의 원소의 합을 모두 구하고 싶을때 사용하면 유용한 함수. 1. accumulate 함수 헤더 파일 #include 2. 함수 원형 std::accumulate(const _INIT , const _INIT , int) 컨테이너의 it..

    code-space.tistory.com

    728x90

    댓글

© 2022. code-space ALL RIGHTS RESERVED.