[STL] unique

STL/변경 가능 시퀀스 알고리즘 2010. 5. 17. 15:43 Posted by zetz
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/*
 
제너릭 unique 알고리즘은 입력 시퀀스에서 모든 연속 중복 원소들을 모두 제거한다.
시퀀스 상에서 자신의 왼쪽에 위치한 원소와 값이 동일하면, 그 원소는 중복 원소에
해당한다. 따라서, 원소들로 구성된 그룹이 있다면 그 그룹의 맨 앞의 원소를 제외한
나머지 원소는 unique 알고리즘을 통해 제거된다. remove 알고리즘과 마찬가지로,
unique 는 컨테이너의 사이즈를 변경하지 않는다. 대신, 연속 중복 원소가 아닌 것들
을 구간의 왼편에 몰아 넣고, "unique"한 원소들이 끝나는 위치를 가리키는 반복자를
리턴한다.
 
단, 중복되어 있다고 해서 무조건 제거되는 것이 아니라 반드시 연속적으로 중복되어
있는 경우에만 삭제된다.
 
시간 복잡도는 선형적이다.
 
*/
 
#include <iostream>
#include <cassert>
#include <algorithm>
#include <vector>
 
using namespace std;
 
int main()
{
    cout<< "Illustrating the generic unique algorithm."<< endl;
    const int N = 11;
    int array1[N] = {1, 2, 0, 3, 3, 0, 7, 7, 7, 0, 8};
    vector<int> vector1;
    for (int i=0; i< N; ++i)
        vector1.push_back(array1[i]);
 
    // vector1에서 연속 중복 원소를 제거한다.
    vector<int>::iterator new_end;
    new_end = unique(vector1.begin(), vector1.end());
 
    // vector1의 사이즈는 변하지 않는다.
    assert (vector1.size() == N);
 
    // 연이어 붙어 있지 않은 중복 원소들은 [vector1.begin(), new_end)에
    // 그대로 남아 있다. new_end 뒷부분의 원소들은 삭제한다.
    vector1.erase(new_end, vector1.end());
 
    // vector1에 담긴 원소들의 표준 출력 스트림으로 출력
    copy(vector1.begin(), vector1.end(), ostream_iterator<int>(cout, " "));
    cout<< endl;
 
    return 0;
}

'STL > 변경 가능 시퀀스 알고리즘' 카테고리의 다른 글

[STL] swap_ranges  (0) 2010.05.17
[STL] transform  (0) 2010.05.17
[STL] search  (0) 2010.05.17
[STL] rotate  (0) 2010.05.17
[STL] reverse  (0) 2010.05.17